策略模式应该是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"
他俩的区别在于,策略模式需要调用者创建好执行逻辑的对象,而工厂模式只需要告诉工厂我们要创建什么。
这么说可能不够具体,你可以这么想象,我们去了一个咖啡厅,想喝一杯咖啡,策略模式的咖啡厅会说
想喝卡布奇诺还是拿铁,自己调好咖啡和奶的比例拿给他,他帮你在咖啡机上磨好装杯子里给你
工厂模式的咖啡厅会说
跟他说要卡布奇诺还是拿铁就行,你不需要关心咖啡豆的比例和制作过程,他帮你做好装杯子里给你
总结
策略模式跟工厂模式其实思想非常接近,都是通过接口来去耦合,而两者的区别也比较容易理解,策略模式侧重于让调用者控制逻辑的实现,工厂模式则侧重于让调用者不关心具体的逻辑,只关心需要用什么东西。
