1.策略模式定义
策略模式定义了算法族,分别封装起来,让它们之后可以互相替换,
此模式让算法的变化独立于使用算法的客户(选自Head+First设计模式)
2.为什么要使用策略模式/什么时候使用策略模式
- 假设作为开发者,目前我们遇到一个问题。有一个仓库类,类中有一个List类型的数组(每个用户在存库存储的物品数量),我们想要给这个数组增加一个排序方法。
- 简单的我们只需要写一个类似于如下代码的方法,添加在仓库类中即可
private void sort() {
//对这个List做排序
}
- 这种方案看起来还不错,但是仔细想想,有几点问题,排序这种方法很明显没有考虑到代码的服用,随着仓库中物品数量的增加是否考虑到可能会修改排序方法提高效率呢?
- 在此场景下或许使用策略模式是个很好的选择
3.策略模式
对于上面的场景使用策略模式可以这样做:1.将排序方法定义接口。2.定义多个排序类对这个接口实现。3.在仓库类中定义属性排序接口。4.在仓库类中定义这个属性的set方法。5.在仓库类中调用对应的排序方法,即通过接口属性.sort()
4.代码演示(代码演示)
步骤 1 创建一个接口。
public interface Strategy {
public int doOperation(int num1, int num2);
}
步骤 2 创建实现接口的实体类。
public class OperationAdd implements Strategy{
@Override
public int doOperation(int num1, int num2) {
return num1 + num2;
}
}
public class OperationSubtract implements Strategy{
@Override
public int doOperation(int num1, int num2) {
return num1 - num2;
}
}
public class OperationMultiply implements Strategy{
@Override
public int doOperation(int num1, int num2) {
return num1 * num2;
}
}
步骤 3 创建 Context 类。
public class Context {
private Strategy strategy;
public Context(Strategy strategy){
this.strategy = strategy;
}
public int executeStrategy(int num1, int num2){
return strategy.doOperation(num1, num2);
}
}
步骤 4 使用 Context 来查看当它改变策略 Strategy 时的行为变化。
public class StrategyPatternDemo {
public static void main(String[] args) {
Context context = new Context(new OperationAdd());
System.out.println("10 + 5 = " + context.executeStrategy(10, 5));
context = new Context(new OperationSubtract());
System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
context = new Context(new OperationMultiply());
System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
}
}
步骤 5 执行程序,输出结果:
10 + 5 = 15
10 - 5 = 5
10 * 5 = 50