Java 策略设计模式
2015-07-21 10:58
423 查看
策略设计模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同的接口的独立类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生。
策略模式的结构
策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象进行管理。策略模式通常把一个系列的算法包装到一些列的策略类里面,作为一个抽象的策略类的子类。
策略模式举例:
定义策略接口:
定义策略模式程序的结构,里面约束整个程序的框架的和执行的大概流程
策略模式的重心
策略模式的重心不是如何实现算法,而是如何阻止、调用这些算法,从而让程序结构更灵活,具有更好的维护性和扩展性。
算法的平等性
策略模式一个很大的特点就是各个策略算法的平等性。对于一系列具体的策略算法,大家的地位是完全一样的,正因为这个平等性,才能实现算法之间的可以相互替换。所有的策略算法在实现上也是相互独立的,相互之间是没有依赖的。
所以可以这样描述这一系列的策略算法:策略算法是相同行为的不同实现。
运行时策略的唯一性
运行期间,策略模式在每一个时刻只能使用一个具体的策略实现对象,虽然可以动态地在不同的策略实现中切换,但是同时只能使用一个
公有的行为
经常见到的是,所有的具体策略类都有一些公有的行为。这时候,就应当把这些公有的行为放到共同的抽象策略角色Strategy类里面。当然这时候抽象策略角色必须要用Java抽象类实现,而不能使用接口。
这其实也是典型的将代码向继承等级结构的上方集中的标准做法。
(1)策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码移到父类里面,从而避免代码重复。
(2)使用策略模式可以避免使用多重条件(if-else)语句。多重条件语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重条件语句里面,比使用继承的办法还要原始和落后。
(1)客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道算法或行为的情况。
(2)由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很可观。
策略模式的结构
策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象进行管理。策略模式通常把一个系列的算法包装到一些列的策略类里面,作为一个抽象的策略类的子类。
策略模式举例:
定义策略接口:
package SheJiMoShi; /** * 策略接口,主要是规范或者让结构程序知道如何进行调用 * @author lenovo * */ public interface CalcStrategy { int calc(int x,int y); }
定义策略模式程序的结构,里面约束整个程序的框架的和执行的大概流程
package SheJiMoShi; /** * 程序的结构,里面约束了整个程序的框架和执行的大概流程,但并未涉及到业务层面的东西 * 只是将一个数据如何流入如何流出做了规范,只是提供了一个默认的逻辑实现 * @author lenovo * */ public class Calculator { private int x = 0; private int y = 0; private CalcStrategy strategy = null; public Calculator(int x,int y){ this.x = x; this.y = y; } public Calculator(int x,int y,CalcStrategy strategy){ this(x,y); this.strategy = strategy; } public int calc(int x,int y){ return x+y; } public int result(){ if(null != strategy){ return strategy.calc(x, y); } return calc(x,y); } }下面定义两个策略类继承了策略接口:
package SheJiMoShi; public class AddStrategy implements CalcStrategy{ @Override public int calc(int x, int y) { return x+y; } }
package SheJiMoShi; public class SubStrategy implements CalcStrategy { @Override public int calc(int x, int y) { return x-y; } }下面是策略类的测试,有三种方式调用策略类:普通默认方式、子类、和修改策略类
package SheJiMoShi; import javax.xml.crypto.dsig.spec.C14NMethodParameterSpec; public class StrategyTest { public static void main(String[] args){ Calculator c = new Calculator(30,24); System.out.println(c.result()); //传入减法策略的结果 Calculator c1 = new Calculator(10,30,new SubStrategy()); System.out.println(c1.result()); //看到这里就可以看到策略模式的强大了,算法可以随意设置,系统的结构并不会发生任何变化 Calculator c2= new Calculator(30,40,new CalcStrategy(){ public int calc(int x,int y){ return (x+10)-(y*3)/2; } }); System.out.println(c2.result()); } }认识策略模式:
策略模式的重心
策略模式的重心不是如何实现算法,而是如何阻止、调用这些算法,从而让程序结构更灵活,具有更好的维护性和扩展性。
算法的平等性
策略模式一个很大的特点就是各个策略算法的平等性。对于一系列具体的策略算法,大家的地位是完全一样的,正因为这个平等性,才能实现算法之间的可以相互替换。所有的策略算法在实现上也是相互独立的,相互之间是没有依赖的。
所以可以这样描述这一系列的策略算法:策略算法是相同行为的不同实现。
运行时策略的唯一性
运行期间,策略模式在每一个时刻只能使用一个具体的策略实现对象,虽然可以动态地在不同的策略实现中切换,但是同时只能使用一个
公有的行为
经常见到的是,所有的具体策略类都有一些公有的行为。这时候,就应当把这些公有的行为放到共同的抽象策略角色Strategy类里面。当然这时候抽象策略角色必须要用Java抽象类实现,而不能使用接口。
这其实也是典型的将代码向继承等级结构的上方集中的标准做法。
策略模式的优点
(1)策略模式提供了管理相关的算法族的办法。策略类的等级结构定义了一个算法或行为族。恰当使用继承可以把公共的代码移到父类里面,从而避免代码重复。(2)使用策略模式可以避免使用多重条件(if-else)语句。多重条件语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重条件语句里面,比使用继承的办法还要原始和落后。
策略模式的缺点
(1)客户端必须知道所有的策略类,并自行决定使用哪一个策略类。这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类。换言之,策略模式只适用于客户端知道算法或行为的情况。(2)由于策略模式把每个具体的策略实现都单独封装成为类,如果备选的策略很多的话,那么对象的数目就会很可观。
相关文章推荐
- java读取properties文件的六种方法
- Java基础语法(一)(标识符,关键字,注释,常量,变量,基本数据类型)
- 重学java23种设计模式-软件设计基本原则
- 饼状图形Factory
- 关于java多线程
- java发送邮件
- Java环境变量设置
- 11. JavaSE-Final关键字详解
- [LeetCode][Java] Path Sum II
- java判断字符串中是否包含字母
- JAVA设计模式之单例模式
- java中==和equals
- Java小数四舍五入与保留位(二)
- 算法_java 搜索指定目录下指定类型的文…
- 语法_java File类的方法
- 10. JavaSE-子类实例化过程 & 构造方法间调用
- Spring 注入
- Java小数四舍五入与保留位(一)
- java 反射机制
- 解决Maven工程中报 Missing artifact jdk.tools:jdk.tools