策略模式设计原则
a) 封装变化的概念
b) 编程中使用接口,而不是对接口的实现,面向接口编程;
策略模式的意义
a) 策略模式使开发人员能够开发出由许多可替换的部分组成的软件,并且各个部分之间是弱连接的关系。
b) 弱连接的特性使软件具有更强的可扩展性,易于维护;更重要的是,它大大提高了软件的可重用性。
策略模式的组成
a) 抽象策略角色:策略类,通常由一个接口或者抽象类实现
b) 具体策略角色:包装了相关的算法和行为
c) 环境角色:持有一个策略类的引用,最终给客户端调用的。
策略模式的编写步骤
a) 对策略对象定义一个公共接口。
b) 编写策略类,该类实现了上面的公共接口
c) 在使用策略对象的类中保存一个对策略对象的引用。
d) 在使用策略对象的类中,实现对策略对象的set和get方法(注入)或者使用构造方法完成赋值
策略模式的缺点
a) 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。
b) 造成很多的策略类。
解决方案:采用工厂方法。
package com.zp.pattern.strategy; public interface Strategy { public int caculate(int a,int b); } package com.zp.pattern.strategy; public class Add implements Strategy { @Override public int caculate(int a, int b) { return a + b; } } package com.zp.pattern.strategy; public class Multiple implements Strategy { @Override public int caculate(int a, int b) { return a * b; } } package com.zp.pattern.strategy; public class Environment { //这是父类的引用,创建的对象可以将指向子类对象的引用赋给父类引用; private Strategy strategy; public Environment(Strategy strategy){ this.strategy = strategy; } public Strategy getStrategy() { return strategy; } public void setStrategy(Strategy strategy) { this.strategy = strategy; } //父类引用指向子类对象,这里的strategy已经指向对应子类对象; public int caculate(int a,int b){ return strategy.caculate(a,b); } } package com.zp.pattern.strategy; public class Test { public static void main(String[] args) { Strategy add = new Add(); Environment e1 = new Environment(add); System.out.println(e1.caculate(3,4)); Multiple multiple = new Multiple(); Environment e2 = new Environment(multiple); System.out.println(e2.caculate(3,4)); } }
结果:7 12
注:主要应用了多态,父类引用指向子类对象,通过父类引用这一个变量,接收多个子类对象,由于父类引用已经通过构造器的初始化指向了子类对象,所以父类引用的调用相当于子类对象的调用,策略模式中既有类的封装,又有面向接口的编程;