策略模式
策略模式(Strategy Pattern)是一种行为型设计模式,它允许在运行时动态地切换算法或策略。该模式定义了一组算法,将每个算法都封装起来,使它们之间可以互相替换,而不影响使用算法的客户端代码。
在策略模式中,定义一个策略接口(Strategy),所有的具体策略都实现该接口。同时,在策略模式中,策略接口通常只包含一个方法。这个方法包含了具体的算法,由具体的策略类实现。在使用策略模式的客户端代码中,需要维护一个对策略接口的引用,客户端代码可以根据需要切换策略。
以下是使用策略模式的一个简单示例代码:
// 策略接口
public interface Strategy {
int execute(int a, int b);
}
// 具体策略A
public class ConcreteStrategyA implements Strategy {
@Override
public int execute(int a, int b) {
return a + b;
}
}
// 具体策略B
public class ConcreteStrategyB implements Strategy {
@Override
public int execute(int a, int b) {
return a - b;
}
}
// 上下文类
public class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public int executeStrategy(int a, int b) {
return strategy.execute(a, b);
}
}
// 测试类
public class Main {
public static void main(String[] args) {
Context context = new Context(new ConcreteStrategyA());
int result1 = context.executeStrategy(1, 2);
System.out.println(result1); // 输出:3
context.setStrategy(new ConcreteStrategyB());
int result2 = context.executeStrategy(1, 2);
System.out.println(result2); // 输出:-1
}
}
在上述代码中,Strategy 接口定义了算法的接口,所有具体的策略都实现了该接口。ConcreteStrategyA 和 ConcreteStrategyB 是具体的策略类,它们分别实现了加法和减法算法。Context 是上下文类,它维护了一个对策略接口的引用。在使用策略模式的客户端代码中,需要先创建一个上下文对象,并指定一个具体的策略。客户端代码可以通过调用上下文对象的 executeStrategy() 方法,来执行具体的算法。在运行时,客户端代码可以通过调用上下文对象的 setStrategy() 方法,来动态地切换算法或策略。