Java策略模式
行万里路,读万卷书 人气:01.基本介绍
1)策略模式(Strategy Pattern)中,定义算法族(策略组),分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户
2)这算法体现了几个设计原则,第一,把变化的代码从不变的代码中分离出来;第二,针对接口编程而不是具体类(定义了策略接口);第三,多用组合/聚合,少用继承(客户通过组合方式使用策略)
例如:针对环境节能,提出了三种节能方式:基带板节能,SPC节能,产品节能,不同的节能方式,对环境设备的具体处理流程不同
2.传统方式
(1)类图
(2)编码实现
1)定义一个EsPolicy抽象类,定义esPolicyHandler方法
public abstract class EsPolicy { public void esPolicyHandler() { } }
2)BbEsPolicy继承EsPolicy,并复写esPolicyHandler方法
public class BbEsPolicy extends EsPolicy { @Override public void esPolicyHandler() { System.out.println("===处理基带板节能策略==="); } }
3)SpcEsPolicy继承EsPolicy,并复写esPolicyHandler方法
public class SpcEsPolicy extends EsPolicy { @Override public void esPolicyHandler() { System.out.println("===Spc节能策略处理==="); } }
4)ProdEsPolicy继承EsPolicy,并复写esPolicyHandler方法
public class ProdEsPolicy extends EsPolicy { @Override public void esPolicyHandler() { System.out.println("===产品节能策略处理==="); } }
5)测试
public class EsPolicyTest { public static void main(String[] args) { EsPolicy bbEsPolicy = new BbEsPolicy(); bbEsPolicy.esPolicyHandler(); SpcEsPolicy spcEsPolicy = new SpcEsPolicy(); spcEsPolicy.esPolicyHandler(); ProdEsPolicy prodPolicy = new ProdEsPolicy(); prodPolicy.esPolicyHandler(); } }
执行结果
===处理基带板节能策略===
===Spc节能策略处理===
===产品节能策略处理===
问题:传统方法是通过子类继承父类并复写父类方法来实现不同子类的不同行为,对类的局部改动,尤其是超类的局部改动,会影响其它部分,会有溢出效应
3.采用策略模式
(1)类图
(2)编码实现
1)定义策略接口并定义抽象方法
public interface EsPolicyHandler { void esPolicyHandler(); }
2)BbEsPolicyHandler实现策略接口,并实现esPolicyHandler方法
public class BbEsPolicyHandler implements EsPolicyHandler { @Override public void esPolicyHandler() { System.out.println("===基带板节能策略处理==="); } }
3)SpcEsPolicyHandler实现策略接口,并实现esPolicyHandler方法
public class SpcEsPolicyHandler implements EsPolicyHandler { @Override public void esPolicyHandler() { System.out.println("===Spc节能策略处理==="); } }
4)ProdEsPolicyHandler实现策略接口,并实现esPolicyHandler方法
public class ProdEsPolicyHandler implements EsPolicyHandler { @Override public void esPolicyHandler() { System.out.println("===产品节能策略处理==="); } }
5)定义EsPolicy抽象类,注入EsPolicyHandler作为其属性
public abstract class EsPolicy { EsPolicyHandler esPolicyHandler; public void setEsPolicyHandler(EsPolicyHandler esPolicyHandler) { this.esPolicyHandler = esPolicyHandler; } public void esPolicyHandler() { if (null != esPolicyHandler) { esPolicyHandler.esPolicyHandler(); } } }
6)BbEsPolicy继承EsPolicy,在构造方法中实例化esPolicyHandler接口属性
public class BbEsPolicy extends EsPolicy { public BbEsPolicy() { esPolicyHandler = new BbEsPolicyHandler(); } }
7)SpcEsPolicy继承EsPolicy,在构造方法中实例化esPolicyHandler接口属性
public class SpcEsPolicy extends EsPolicy { public SpcEsPolicy() { esPolicyHandler = new SpcEsPolicyHandler(); } }
8)ProdEsPolicy继承EsPolicy,在构造方法中实例化esPolicyHandler接口属性
public class ProdEsPolicy extends EsPolicy { public ProdEsPolicy() { esPolicyHandler = new ProdEsPolicyHandler(); } }
9)测试
public class EsPolicyTest { public static void main(String[] args) { BbEsPolicy bbEsPolicy = new BbEsPolicy(); bbEsPolicy.esPolicyHandler(); SpcEsPolicy spcEsPolicy = new SpcEsPolicy(); spcEsPolicy.esPolicyHandler(); ProdEsPolicy prodEsPolicy = new ProdEsPolicy(); prodEsPolicy.esPolicyHandler(); } }
10)执行结果
===处理基带板节能策略===
===Spc节能策略处理===
===产品节能策略处理===
4.策略模式的注意事项和细节
1)策略模式的关键是:分析项目中变化部分与不变部分
2)策略模式的核心思想是:多用组合/聚合,少用继承;用行为类组合,而不是行为的继承,更有弹性;
3)体现了“对修改关闭,对扩展开放”原则,客户端增加行为而不用修改原有的代码,只要添加一种策略(或者行为)即可,避免了使用多重转移语句(if…else if…else)
4)提供了可以替换继承关系的办法:策略模式将算法封装在独立的Strategy类中使得你可以独立于其Context改变它,使它易于切换、易于理解、易于扩展
5)需要注意的是:每添加一个策略就要增加一个类,当策略过多是会导致类数量庞大
加载全部内容