1、定义
分别封装行为接口,超类存放行为接口对象,在子类里设定具体的行为对象,换句话说,就是定义了一系列行为的接口,在使用者的超类中持有此接口类型的对象,在具体的使用者设置具体的行为对象,达到使用不同策略的目的。
2、使用场景
1、针对同一种问题有不同的解决方式,不同的解决方式之间可以互换,不会造成影响。
2、当出现if-else判断语句来选择具体的行为对象的时候可以考虑策略模式。
3、UML类图
4、代码实现
/**
* 定义算法接口
*/
public interface IAlgorithm {
int calculate(int a, int b);
}
/**
* 减法运算策略
*/
public class Minus implements IAlgorithm {
@Override
public int calculate(int a, int b) {
return a - b;
}
}
/**
* 加法运算策略
*/
public class Plus implements IAlgorithm {
@Override
public int calculate(int a, int b) {
return a + b;
}
}
/**
* 充当Context的角色
*/
public class Calculator {
private IAlgorithm algorithm;
/**
* 选择不同的策略
* @param algorithm
*/
public void setAlgorithm(IAlgorithm algorithm) {
this.algorithm = algorithm;
}
/**
* 根据不同策略来实现不同的算法
* @param a
* @param b
* @return
*/
public int calculate(int a, int b) {
return algorithm.calculate(a, b);
}
}
public class MainTest {
public static void main(String[] args) {
Calculator calculator = new Calculator();
//选择不同的策略
calculator.setAlgorithm(new Minus());
calculator.calculate(1, 2);
}
}
5、总结
优点:1、不同策略之间互不影响,完全可以互换,能够很好的解耦合,扩展性好。
2、具有良好的封装,结构简单清晰,便于维护不同的策略。
缺点:造成类的增多。
总的来说,策略模式你叫简单,但是要区别于模板方法模式,模板方法模式是定义莫一种算法的整体框架,其中关键的部分让子类去实现,采用的是继承的方式,而策略模式定义的是一系列算法,算法之间相互独立,可以互相替换而不会造成影响,采用的是组合的方式来时。
6、在Android源码中的应用
Android动画插值器。
代码:https://gitee.com/os2chen/DesignPattern
参考:《Head First Design》、《Android源码设计模式解析与实战》