Java设计模式之策略模式深入刨析(java策略模式应用场景)

网友投稿 306 2022-07-30


目录1.基本介绍2.传统方式3.采用策略模式4.策略模式的注意事项和细节

1.基本介绍

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 EjdTMtWBgtRsPolicy {

@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)需要注意的是:每添加一个策略就要增加一个类,当策略过多是会导致类数量庞大


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:关于SpringBoot禁止循环依赖解说
下一篇:Mybatis的xml中使用if/else标签的具体使用(mybatis中xml文件里使用的标签)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~