策略模式及与简单工厂模式的结合
策略模式:
1.策略模式动机:完成一项任务有多种不同的方式,每一种方式称为一种策略,我们可以根据环境或者条件的不同选择不同的策略来完成该项任务。
在软件开发中常常遇到这种情况:实现某一功能有多种途径,此时可以使用一种设计模式来使系统可以灵活的选择解决途径,也能够方便的增加新的
解决途径。
2.策略模式是对象的行为模式,用意是对一组算法的封装。动态的选择需要的算法并使用
上例中的人出行方式有多种,通过封装出行的方法,动态的选择需要的算法并使用。
3.策略模式角色:
(1)抽象策略角色:通常用一个抽象类或者接口来实现,主要是定义这个算法所完成的功能
(2)具体策略角色:包装了相关算法和行为
(3)环境角色:持有策略类的引用
对应上图中: 抽象策略模式 <---> 旅行出行方式
具体策略角色 <---> 骑车,骑车,火车,飞机
环境角色 <---> 人(对策略的使用)
环境类:Context
4.策略模式比较简单和并易于使用,策略模式是对算法的封装,它把算法的职责和和算法本身分隔开,委派不同的对象管理。
策略模式通常将一系列算法封装到一系列的策略类里面,作为一个抽象策略类的子类,换一句话说:“准备一组算法,并将每一个算法封装起来,使得他们可以互换”。
5.优缺点
优点:
(1)动态改变算法或行为
(2)简化了单元测试,因为每个算法都有自己的类,可以通过自己的接口单独测试
缺点:客户端必须知道所有的策略类,并自行决定使用哪一个策略类,必须对每一个算法了解
6.策略模式与简单工厂模式的结合
在Context环境角色类中结合简单工厂模式,即在Context中设计构造函数,传入自变量,环境角色根据传入的自变量选择使用的算法,
这样的缺点是客户端在使用前要具备识别Context的能力,即知道参数的含义。
下面是实例代码
package Strategy;public class Main {public static void main(String[] args) {Context context = new Context(); /*创建环境角色*/double ret = context.add.getResult(12.0, 23.99);System.out.println("context.add.getResult(12.0, 23.99) = " + ret);ret = context.multi.getResult(12.0, 4);System.out.println("context.multi.getResult(12.0, 4) = " + ret);/*策略模式和简单工厂模式结合*/Context contFac = new Context(2);/*要事先知道传入2代表什么,这是缺点*/ret = contFac.opr.getResult(2, 23);System.out.println("conFac.opr.getResult(2, 23) = " + ret);}}