二十三、策略模式
策略模式(Strategy Pattern),可以使得一个类的行为或算法,在运行时进行更改。有点类似状态模式,需要创建表示各种策略的对象,
以及一个行为随着策略而变化的context对象,通过策略对象的改变,来改变执行对象的行为算法。
简介
定义一系列的算法,并封装起来作为策略,可相互替换。
- 优点:算法可以自由切换,避免使用多重条件判断,扩展性好。
- 缺点:策略类较多,且需要对外公开。
若是策略类真的多了,可以使用混合模式,不要局限于单一的设计模式。
实现
定义一个活动的Strategy
接口和它的实现类,以及Context
,使用了某个策略的行为类。
- 创建接口
Strategy.java
public interface Strategy {
public int doOperation(int num1,int num2);
}
- 接口实现
OperationAdd.java
public class OperationAdd implements Strategy {
@override
public int doOperation(int num1,int num2){
return num1+num2;
}
}
````
`OperationSubstract.java`
<div class="se-preview-section-delimiter"></div>
```java
public class OperationSubstract implements Strategy{
@override
public int doOperation(int num1,int num2){
return num1-num2;
}
}
OperationMultiply.java
public class OperationMultiply implements Strategy {
@override
public int doOperation(int num1,int num2){
return num1*num2;
}
}
- 创建行为类
Context.java
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);
}
}
- 演示
StrategyPatternDemo.java
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 OperationSubstract());
System.out.println("10-5=" + context.executeStrategy(10,5));
context = new Context(new OperationMultiply());
System.out.println("10*5=" + context.executeStrategy(10,5));
}
}
- 输出
10 + 5 = 15
10 - 5 = 5
10 * 5 = 50