"围观"设计模式(20)--行为型之策略模式(Strategy Pattern)
2016-06-12 19:05
447 查看
策略模式作为一种软件设计模式,指对象有某个行为,但是在不同的场景中,该行为有不同的实现算法。比如每个人都要“交个人所得税”,但是“在美国交个人所得税”和“在中国交个人所得税”就有不同的算税方法。----WIKIPEDIA
其中,TrafficLight接口提供了统一的接口,其他的几个类实现该接口并实现其中的方法,那么这样的设计就可以保证其可以进行替换,然后Context类则提供了策略的选择类,与其说是选择不如说是提供了外界访问的入口,只需要根据不同的策略创建好context的实例然后直接调用其方法就可以了,这里的名称并不一定要和接口中相同。
接口代码:
策略的选取类
测试类
一般策略模式
加减运算,按照上面的架构方式,完全可以实现,基本的形式为,同样提供一个接口和Context供选择策略的类即可。这里只列出其类图,代码可以根据下面的链接进行下载[b]设计模式源代码下载。[/b]
测试类
1. 他本身是枚举。
2. 他可以实现策略模式。
2. 避免了多重的判断。
3. 扩展性比较好,如果再多的策略的时候,可以继续实现统一的接口,实现其方法即可。
2. 所有的策略类都需要对外暴露,上层模块必须知道有哪些策略然后才能知道应该使用哪个策略,这与迪米特法则相违背,不过可以通过其他的模式来弥补其缺陷,比如:工厂方法模式、代理模式、享元模式。
2. 具体的实现方法可以进行自由的切换。
[b]"围观"设计模式(19)--行为型之观察者模式(Observer Pattern)
[/b]
[b]"围观"设计模式(16)--结构型之组合模式(Composite
Pattern)
[/b]
个人理解
策略模式从名字就可以看出,有多种选择,不同的策略对应着不同的实现方式,那么一般的形式为一个接口采用多种实现方式(也就是提供了不同的策略),然后再提供一个策略的选择类即可,定义中:定义一组算法,将每个算法都封装起来,并且使得他们之间可以相互的转换。通过上面我提到的这种方式来看,一组算法就是指的多种的实现方式,而将每个算法都封装起来并使得他们之间可以互换,实现了统一的接口,自然可以实现互换了。案例解析
举个比较常见的例子,红绿灯,当你过马路的时候,会看一下红绿灯,从小就学会了:绿灯行、红灯停、黄灯亮了等一等。这样的话,相当于三个策略,根据这个实例来设计类的结构。其中,TrafficLight接口提供了统一的接口,其他的几个类实现该接口并实现其中的方法,那么这样的设计就可以保证其可以进行替换,然后Context类则提供了策略的选择类,与其说是选择不如说是提供了外界访问的入口,只需要根据不同的策略创建好context的实例然后直接调用其方法就可以了,这里的名称并不一定要和接口中相同。
接口代码:
public interface TrafficLight { /** * 输出该灯对应的注意事项 */ public void checkLight(); }
策略的选取类
public class Context { private TrafficLight light; public Context() { super(); } public Context(TrafficLight light) { super(); this.light = light; } public void checkLight(){ this.light.checkLight(); } }接口的实现(只列出一个)
public class RedLight implements TrafficLight { @Override public void checkLight() { System.out.println("停"); } }
测试类
public static void main(String[] args) { Context context = null; context = new Context(new RedLight()); context.checkLight(); context = new Context(new YellowLight()); context.checkLight(); context = new Context(new GreenLight()); context.checkLight(); }
策略模式拓展
一般策略模式
加减运算,按照上面的架构方式,完全可以实现,基本的形式为,同样提供一个接口和Context供选择策略的类即可。这里只列出其类图,代码可以根据下面的链接进行下载[b]设计模式源代码下载。[/b]策略枚举
通过枚举实现策略模式的一个示例,主要的代码如下public enum Calculator { ADD("+"){ @Override public int cal(int a, int b) { return a + b; } }, SUB("-"){ @Override public int cal(int a, int b) { return a - b; } }; String value = ""; private Calculator(String value) { this.value = value; } public abstract int cal(int a, int b); }
public class Context { public void cal(int a,String operator, int b){ if("+".equals(operator)){ System.out.println(Calculator.ADD.cal(a, b)); }else if("-".equals(operator)){ System.out.println(Calculator.SUB.cal(a, b)); } } }
测试类
public static void main(String[] args) { Context context = new Context(); context.cal(1, "+", 2); context.cal(1, "-", 2); }
1. 他本身是枚举。
2. 他可以实现策略模式。
策略模式的优点
1. 具体实现可以自由的切换。2. 避免了多重的判断。
3. 扩展性比较好,如果再多的策略的时候,可以继续实现统一的接口,实现其方法即可。
策略模式的缺点
1. 策略类的数量增多。2. 所有的策略类都需要对外暴露,上层模块必须知道有哪些策略然后才能知道应该使用哪个策略,这与迪米特法则相违背,不过可以通过其他的模式来弥补其缺陷,比如:工厂方法模式、代理模式、享元模式。
策略模式适用场景
1. 多个类只在具体的实现上有所不同。2. 具体的实现方法可以进行自由的切换。
设计模式源代码下载
设计模式源代码下载设计模式系列文章推荐阅读
"围观"设计模式(18)--行为型之模板方法模式(TemplateMethod Pattern)[b]"围观"设计模式(19)--行为型之观察者模式(Observer Pattern)
[/b]
[b]"围观"设计模式(16)--结构型之组合模式(Composite
Pattern)
[/b]
相关文章推荐
- JavaScript遍历求解数独问题的主要思路小结
- URI
- Linux中的c语言实现类似迅雷那样的下载
- iOS开发 报错process launch failed: timed out waiting for app to launch的解决方案
- ELK -分析nginx 日志
- 常用网络结构
- 飛飛(六十五)洗牌游戏解法二
- 栈的压入、弹出序列23
- ios开发使用Basic Auth 认证方式
- jzoj 2016.6.11noip模拟赛B总结
- App 即时通讯 SDK
- 第十五周学习进度条
- 飛飛(六十四)洗牌游戏解法一
- 网站移动端自适应匹配搜索引擎优化
- yii框架之简单的验证码实现
- Kafka - SQL 引擎分享
- shell 脚本
- Android输入法开发之Android SDK Sample—SoftKeyboard
- Codeforces 513G2 Inversions problem (dp)
- iOS 支付 [支付宝、银联、微信]