首页 > Java > java教程 > Java设计模式之策略模式实例分析

Java设计模式之策略模式实例分析

WBOY
发布: 2023-05-02 16:49:07
转载
1367 人浏览过

1.基本介绍

1)策略模式(Strategy Pattern)中,定义算法族(策略组),分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户

2)这算法体现了几个设计原则,第一,把变化的代码从不变的代码中分离出来;第二,针对接口编程而不是具体类(定义了策略接口);第三,多用组合/聚合,少用继承(客户通过组合方式使用策略)

例如:针对环境节能,提出了三种节能方式:基带板节能,SPC节能,产品节能,不同的节能方式,对环境设备的具体处理流程不同

2.传统方式

(1)类图

Java设计模式之策略模式实例分析

(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)类图

Java设计模式之策略模式实例分析

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

以上是Java设计模式之策略模式实例分析的详细内容。更多信息请关注PHP中文网其他相关文章!

相关标签:
来源:yisu.com
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板