策略模式应该是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"
他俩的区别在于,策略模式需要调用者创建好执行逻辑的对象,而工厂模式只需要告诉工厂我们要创建什么。
这么说可能不够具体,你可以这么想象, 我们去了一个咖啡厅,想喝一杯咖啡, 策略模式的咖啡厅会说
工厂模式的咖啡厅会说
策略模式跟工厂模式其实思想非常接近, 都是通过接口来去耦合, 而两者的区别也比较容易理解, 策略模式侧重于让调用者控制逻辑的实现, 工厂模式则侧重于让调用者不关心具体的逻辑,只关心需要用什么东西。