定义
在开发中,我们为了解决一个业务逻辑,可能会根据不同的情况采取不同的策略或者算法来解决,通常会将这些算法写在一个类中,通过if else或者switch case来选择。但是这种方式代码耦合性太高,代码臃肿,而且也不符合开闭原则。而策略模式能很好地解决这类问题。
策略模式定义了一系列算法,并将每一个算法封装起来,并且他们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。
UML类图
策略模式.png策略模式的角色
-
Context
用来操作策略的上下文环境
-
Strategy
策略的抽象
-
ConcreteStrategy
策略的实现,实现具体的策略逻辑
示例
我们将数学的四则运算抽象成一个运算策略,并实现对应的具体运算策略,在需要计算时注入相应的具体运算策略即可。
/**
* 运算策略的抽象
*/
public interface MathOperation {
int operate(int param1, int param2);
}
/**
* 加法运算策略
* 实现具体的加法策略逻辑
*/
public class AddOperation implements MathOperation {
@Override
public int operate(int param1, int param2) {
return param1 + param2;
}
}
/**
* 减法运算策略
* 实现具体的减法策略逻辑
*/
public class SubtractOperation implements MathOperation {
@Override
public int operate(int param1, int param2) {
return param1 - param2;
}
}
/**
* 用来操作策略的上下文对象
* 通过setOperation方法注入具体的运算策略
*/
public class Context {
private MathOperation operation;
public void setOperation(MathOperation operation) {
this.operation = operation;
}
public int operate(int param1, int param2) {
return operation.operate(param1, param2);
}
}
public static void main(String []args){
Context context = new Context();
context.setOperation(new AddOperation());
System.out.println("1+2的结果是:"+context.operate(1,2));
context.setOperation(new SubtractOperation());
System.out.println("1-2的结果是:"+context.operate(1,2));
}
1+2的结果是:3
1-2的结果是:-1
Android源码中的策略模式
在使用属性动画时,我们会通过设置不同的差值器,如AccelerateInterpolator、LinearInterpolator等,达到加速、匀速或者减速的动画效果。具体可以查看属性动画源码浅析Android源码学习-属性动画源码浅析。
网友评论