什么是策略模式

137 阅读3分钟
原文链接: mp.weixin.qq.com

策略模式应该是Java设计模式中最简单的一种模式,它的核心思想是,一个类的行为可以在运行时动态改变,有不同的实现逻辑。

其实具体的说,它也是基于面向接口编程的思想,通过定义不同的实现类逻辑来做到的。

策略模式接口定义

比方说现在需要一个计算逻辑,对两个输入的数进行某种运算,这里可以定义接口为

public interface Caculator {    public int doCaculate(int a, int b);}

策略模式实现

现在如果需要实现加法和算法,只需要定义两个对应的类,实现接口就可以

public AddCaculator implements Caculator {    public  int doCaculate(int a, int b) {        return a + b;    }}public SubstractCaculator implements Caculator {    public  int doCaculate(int a, int b) {        return a - b;    }}

最后一步,策略模式需要一个策略类,

public class CalContext {    private Caculator strategy;    public CalContext ( Caculator caculator) {        this.strategy = caculator;    }    public int executeStragety(int a , int b) {        return this.stragety.doCaculate(a, b);    }}```#### 策略模式使用在需要使用这个计算逻辑的时候,只需要实例化对应的类就可以,

javascript….    Caculator caculator = new AddCaculator();    CalContext context = new CalContext(caculator);    context.executeStragety(1, 2);````

划重点

到这里你可能会有些疑问,策略模式跟简单工厂模式有什么区别?都是定义个接口,往一个Context/Factory类里传东西,然后执行抽象好的接口,从代码层次来说一模一样啊?这里来回顾下之前说的工厂模式,设计模式之工厂模式

这里重点关注一个地方,我们往  Context/Factory 的构造方法里穿的东西不同· 策略模式  我们传的是构造好的执行对象, AddCaculator()· 工厂模式  这里传的是不是对象,而是定义好的参数,比如 "add"

他俩的区别在于,策略模式需要调用者创建好执行逻辑的对象,而工厂模式只需要告诉工厂我们要创建什么。

这么说可能不够具体,你可以这么想象,我们去了一个咖啡厅,想喝一杯咖啡,策略模式的咖啡厅会说

想喝卡布奇诺还是拿铁,自己调好咖啡和奶的比例拿给他,他帮你在咖啡机上磨好装杯子里给你

工厂模式的咖啡厅会说

跟他说要卡布奇诺还是拿铁就行,你不需要关心咖啡豆的比例和制作过程,他帮你做好装杯子里给你

总结

策略模式跟工厂模式其实思想非常接近,都是通过接口来去耦合,而两者的区别也比较容易理解,策略模式侧重于让调用者控制逻辑的实现,工厂模式则侧重于让调用者不关心具体的逻辑,只关心需要用什么东西。