1.简介
In computer programming, the strategy pattern (also known as the policy pattern) is a behavioral software design pattern that enables selecting an algorithm at runtime. Instead of implementing a single algorithm directly, code receives run-time instructions as to which in a family of algorithms to use.
——Quote from wikipedia
在计算机编程中,策略模式(也称为策略模式)是一种行为软件设计模式,它支持在运行时选择算法。代码接收运行时指令,而不是直接实现单个算法,这些指令在一系列算法中使用。
[站外图片上传中...(image-c98784-1573659608688)]
2.策略模式的特点
优点: 1、算法可以自由切换。 2、避免使用多重条件判断。 3、扩展性良好。
缺点: 1、策略类会增多。 2、所有策略类都需要对外暴露。
使用场景: 1、如果在一个系统里面有许多类,它们之间的区别仅在于它们的行为,那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为。 2、一个系统需要动态地在几种算法中选择一种。 3、如果一个对象有很多的行为,如果不用恰当的模式,这些行为就只好使用多重的条件选择语句来实现。
注意事项:如果一个系统的策略多于四个,就需要考虑使用混合模式,解决策略类膨胀的问题。
3.相关实例
这里我们通过计算加减乘除来实例策略模式的运用,以算法为基类,其子类实现相关的运算逻辑,我们通过选择相应的子类来决定使用什么样的算法。
interface Strategy {
int doOperation(int num1, int num2);
}
class OperationAdd implements Strategy {
@Override
public int doOperation(int num1, int num2) {
System.out.println("add: " + num1 + "+" + num2);
return num1 + num2;
}
}
class OperationSubtract implements Strategy {
@Override
public int doOperation(int num1, int num2) {
System.out.println("substract: " + num1 + "-" + num2);
return num1 - num2;
}
}
class OperationMultiply implements Strategy {
@Override
public int doOperation(int num1, int num2) {
System.out.println("multiply: " + num1 + "*" + num2);
return num1 * num2;
}
}
class OperationDivide implements Strategy {
@Override
public int doOperation(int num1, int num2) {
System.out.println("divide: " + num1 + "/" + num2);
return num1 / num2;
}
}
class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public int executeStrategy(int num1, int num2) {
return strategy.doOperation(num1, num2);
}
}
public class Demo {
public static void main(String[] args) {
Context context1 = new Context(new OperationAdd());
int result1 = context1.executeStrategy(9, 3);
System.out.println("strategy result: "+result1+"
");
Context context2 = new Context(new OperationMultiply());
int result2 = context2.executeStrategy(9, 3);
System.out.println("strategy result: "+result2+"
");
Context context3 = new Context(new OperationSubtract());
int result3 = context3.executeStrategy(9, 3);
System.out.println("strategy result: "+result3+"
");
}
}
输出结果:
add: 9+3
strategy result: 12
multiply: 9*3
strategy result: 27
substract: 9-3
strategy result: 6