文章摘要: 策略模式使用总结。
简介
简要说明
- 策略模式(Strategy Pattern)是一种行为型设计模式。
- 允许在运行时选择不同的算法行为,通过将算法封装在独立的类中,并在运行时根据需要切换这些算法。
主要功能
- 定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换。
- 允许算法的变化独立于使用算法的客户。
- 允许客户端从算法中解耦,算法可以独立于客户端变化。
注意事项
- 客户端必须知道所有的策略类,并能够决定使用哪一个策略类。
- 策略模式造成很多策略类,每个具体策略类都会产生一个新类。
- 所有的策略类都需要对外暴露出一个公共接口,较高的抽象水平可能会导致具体实现策略时的一些限制。
适用场景
- 当一个系统需要在几种算法中动态选择一种时。
- 当一个对象有很多的行为,并且这些行为在这个对象的类中会以多个条件语句的形式出现时。
- 当算法使用的数据从外部传入时,策略模式可以避免暴露复杂的、与算法相关的数据结构。
Java 8
案例
// 策略接口,定义所有支持的算法的公共操作
interface Strategy {
int doOperation(int num1, int num2);
}
// 具体策略类,实现了策略接口
class OperationAdd implements Strategy {
// 加法算法
@Override
public int doOperation(int num1, int num2) {
return num1 + num2;
}
}
class OperationSubtract implements Strategy {
// 减法算法
@Override
public int doOperation(int num1, int num2) {
return num1 - num2;
}
}
class OperationMultiply implements Strategy {
// 乘法算法
@Override
public int doOperation(int num1, int num2) {
return num1 * num2;
}
}
// 上下文类,使用某种策略
class Context {
private Strategy strategy;
// 设置策略
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
// 执行策略
public int executeStrategy(int num1, int num2) {
return strategy.doOperation(num1, num2);
}
}
// 客户端代码,使用策略模式
public class StrategyPatternDemo {
public static void main(String[] args) {
Context context = new Context();
// 设置加法策略
context.setStrategy(new OperationAdd());
System.out.println("10 + 5 = " + context.executeStrategy(10, 5));
// 设置减法策略
context.setStrategy(new OperationSubtract());
System.out.println("10 - 5 = " + context.executeStrategy(10, 5));
// 设置乘法策略
context.setStrategy(new OperationMultiply());
System.out.println("10 * 5 = " + context.executeStrategy(10, 5));
}
}
注释
- 在这个例子中,
Strategy接口定义了一个方法doOperation,它将由具体的策略类实现。OperationAdd、OperationSubtract和OperationMultiply是三个具体的策略类,它们分别实现了加法、减法和乘法算法。 Context类是上下文类,它持有一个策略对象,并提供了一个设置策略的方法setStrategy和执行策略的方法executeStrategy。- 客户端代码
StrategyPatternDemo创建了Context对象,并通过调用setStrategy方法来设置不同的策略。然后,它调用executeStrategy方法来执行所选的策略,并打印结果。通过这种方式,客户端可以在运行时动态地改变算法行为。