策略模式
介绍
意图:定义一系列的算法,封装了每个算法,并使它们可以互换。
主要解决:在有多种算法相似的情况下,使用 if...else
所带来的复杂和难以维护。
何时使用:一个系统有许多许多类,而区分它们的只是他们直接的行为。
优点:
- 算法可以自由切换。
- 避免使用多重条件判断。
- 扩展性良好。
缺点:
- 策略类会增多。
- 所有策略类都需要对外暴露。
使用场景:
- 如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。
- 一个系统需要动态地在几种算法中选择一种。
- 如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
注意事项:
如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。
实现
UML图
代码
/**
* 策略接口
*/
public interface Strategy {
int doOperation(int a, int b);
}
/**
* 策略实现类
*/
public class OperationAdd implements Strategy {
@Override
public int doOperation(int a, int b) {
return a + b;
}
}
public class OperationSub implements Strategy {
@Override
public int doOperation(int a, int b) {
return a - b;
}
}
/**
* 环境类
*/
public class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public int execute(int a, int b){
return strategy.doOperation(a, b);
}
}
public class Main {
public static void main(String[] args) {
Context context = new Context(new OperationAdd());
System.out.println(context.execute(1,2));
context = new Context(new OperationSub());
System.out.println(context.execute(5,3));
}
}