设计模式之策略模式

📝个人主页:五敷有你

🔥系列专栏:设计模式

⛺️稳中求进,晒太阳

概念

1、策略模式(Strategy Pattern)是一种比较简单的模式,也叫做政策模式(PolicyPattern)。

定义如下:

Define a family of algorithms,encapsulate each one,and make them interchangeable. (定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。)

  • 如果有大量的判断,if else 可以通过策略模式进行替换,如下:
java 复制代码
      int a=1;int b=0;
        if(a>b){
            int c=a+b;
            System.out.println(c);
        }if(a<b){
            int c=a-b;
            System.out.println(c);
        }else {
            int c=a*b;
            System.out.println(c);
        }

太多的if else导致代码十分冗余,这还是每个语句块只有两行代码,如果有几百行其不得累死。

  • 避免使用多重条件转换语句
  • 提高算法的保密性和安全性

在策略模式中,我们创建表示各种策略的对象一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法

何时使用:

一个系统有许多许多类,而区分它们的只是他们直接的行为

具体实现:

  1. 定义一个接口行为 StrategyDemo
java 复制代码
public interface StrategyDemo {
     public int operation(int num1,int num2);

}

2 . 不同策略行为的实现不同

各种策略的对象(加法策略、减法策略。。。)

加法行为:

java 复制代码
package strategy;

public class AddStrategy  implements StrategyDemo {
    @Override
    public int operation(int num1, int num2) {

        return num1+num2;
    }
}

减法行为:

java 复制代码
package strategy;

public class SubStrategy implements StrategyDemo{

    @Override
    public int operation(int num1, int num2) {

        return num1-num2;
    }
}

3 . 之后定义一个类,定义一个策略的接口,之后要使用哪种策略,直接替换接口的实现类即可。

java 复制代码
package strategy;

public class Operation {

    private StrategyDemo strategyDemo;

    public Operation(StrategyDemo strategyDemo) {
        this.strategyDemo = strategyDemo;
    }
    public int execute(int num1,int num2){
        return strategyDemo.operation(num1,num2);
    }
}

4 . 测试

java 复制代码
package strategy;

public class Test {
    public static void main(String[] args) {
        //加法
        Operation operation=new Operation(new AddStrategy());
        int execute = operation.execute(1, 2);
        System.out.println("1+2 = "+execute);

        //减法
        Operation operation1=new Operation(new SubStrategy());
        int execute1 = operation1.execute(1, 2);
        System.out.println("1-2 = "+execute1);
    }
}

5 . 运行结果

总结

策略模式定义了一系列算法,从概念上来说,所有的这些算法都是做相同的事情,只是实现不同,他可以以相同的方式调用所有的方法,减少了各种算法类与使用算法类之间的耦合。

从另外一个层面上来说,单独定义算法类,也方便了单元测试,因为可以通过自己的算法进行单独测试。

实践中,不仅可以封装算法,也可以用来封装几乎任何类型的规则,是要在分析过程中需要在不同时间应用不同的业务规则,就可以考虑是要策略模式来处理各种变化。

相关推荐
float_六七1 小时前
IntelliJ IDEA双击Ctrl的妙用
java·ide·intellij-idea
能摆一天是一天2 小时前
JAVA stream().flatMap()
java·windows
CodeCraft Studio2 小时前
PDF处理控件Aspose.PDF教程:使用 Python 将 PDF 转换为 Base64
开发语言·python·pdf·base64·aspose·aspose.pdf
零点零一2 小时前
VS+QT的编程开发工作:关于QT VS tools的使用 qt的官方帮助
开发语言·qt
颜如玉3 小时前
🤲🏻🤲🏻🤲🏻临时重定向一定要能重定向🤲🏻🤲🏻🤲🏻
java·http·源码
程序员的世界你不懂4 小时前
【Flask】测试平台开发,新增说明书编写和展示功能 第二十三篇
java·前端·数据库
星空寻流年4 小时前
设计模式第一章(建造者模式)
java·设计模式·建造者模式
lingchen19065 小时前
MATLAB的数值计算(三)曲线拟合与插值
开发语言·matlab
gb42152875 小时前
java中将租户ID包装为JSQLParser的StringValue表达式对象,JSQLParser指的是?
java·开发语言·python
一朵梨花压海棠go5 小时前
html+js实现表格本地筛选
开发语言·javascript·html·ecmascript