设计模式之策略模式

📝个人主页:五敷有你

🔥系列专栏:设计模式

⛺️稳中求进,晒太阳

概念

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 . 运行结果

总结

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

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

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

相关推荐
Humbunklung2 分钟前
Rust枚举:让数据类型告别单调乏味
开发语言·后端·rust
Y1nhl5 分钟前
力扣_链表_python版本
开发语言·python·算法·leetcode·链表·职场和发展
OEC小胖胖18 分钟前
深入理解 Vue.js 响应式原理及其在 Web 前端开发中的应用
开发语言·前端·javascript·vue.js·web
qq_4017004121 分钟前
C语言中位运算以及获取低8位和高8位、高低位合并
c语言·开发语言·算法
yanjiaweiya25 分钟前
云原生-集群管理
java·开发语言·云原生
gadiaola33 分钟前
【JavaSE面试篇】Java集合部分高频八股汇总
java·面试
艾迪的技术之路1 小时前
redisson使用lock导致死锁问题
java·后端·面试
qianbo_insist1 小时前
c++ python 共享内存
开发语言·c++·python
今天背单词了吗9801 小时前
算法学习笔记:8.Bellman-Ford 算法——从原理到实战,涵盖 LeetCode 与考研 408 例题
java·开发语言·后端·算法·最短路径问题