菜单
首页
博客
相册
时间轴
联系我
倒计时
设计模式入门:策略模式
设计模式
|
2018-04-06 20:11:24
|
76 阅读
|
Linux
java
>文章中部分定义和解释性文字,都是引用百度百科,主要的代码及场景应用为本人原创 **策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。** >场景:我在设计一个后台管理系统时有一个主题更换的需求,要求是有预制的几套主题样式,同时还能用户自定义样式,针对这个需求可以采用策略模式 **设计**  **构成** * 抽象策略角色: 策略类,通常由一个接口或者抽象类实现(ThemeColor,ThemeBackground)。 * 具体策略角色:包装了相关的算法和行为(DefaultColor,DefaultBackground ...)。 * 环境角色:持有一个策略类的引用,最终给客户端调用(Theme)。 **实现** `代码地址:https://github.com/telundusiji/designpattern` ThemeColor 颜色接口 ``` public interface ThemeColor { void color(); } ``` ThemeBackground 背景接口 ``` public interface ThemeBackground { void background(); } ``` DefaultColor 默认颜色 ``` public class DefaultColor implements ThemeColor { public void color() { System.out.println("默认的主题色"); } } ``` BlueColor 蓝色(其他实现) ``` public class BlueColor implements ThemeColor { public void color() { System.out.println("蓝色的主题色"); } } ``` DefaultBackground 默认背景 ``` public class DefaultBackground implements ThemeBackground { public void background() { System.out.println("默认的背景"); } } ``` SkyBackground 天空背景(其他实现) ``` public class SkyBackground implements ThemeBackground{ public void background() { System.out.println("Sky的背景"); } } ``` Theme 主题(应用场景) ``` public class Theme { private ThemeColor color; private ThemeBackground background; public Theme() { this.color = new DefaultColor(); this.background = new DefaultBackground(); } public Theme(ThemeColor color, ThemeBackground background) { this.color = color; this.background = background; } public ThemeColor getColor() { return color; } public void setColor(ThemeColor color) { this.color = color; } public ThemeBackground getBackground() { return background; } public void setBackground(ThemeBackground background) { this.background = background; } public void show() { color.color(); background.background(); } } ``` **经典应用** JDK中的java.util.Comparator和import java.util.Collections.sort(list,comparator); * Comparator接口为抽象策略角色 * 每一个实现Comparator接口的类为具体策略角色 * Collections.sort()为环境角色 这样只要实现Comparator接口的类只需要指明两个实例是如何比较大小,就可以使用sort方法实现排序,而无需知道排序所使用什么算法。 **优缺点** 优点: * 策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码转移到父类里面,从而避免重复的代码。 * 策略模式提供了可以替换继承关系的办法。 * 使用策略模式可以避免使用多重条件转移语句。 缺点: * 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。 * 策略模式造成很多的策略类,每个具体策略类都会产生一个新类,这样会导致策略类太多不便于管理维护
back
to top