策略模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换。策略模式可以让算法的变化独立于使用它的客户。
策略模式包含以下主要角色:
- 策略(Strategy) - 定义了一个算法接口,各种不同的算法都实现了这个接口。
- 上下文(Context) - 维护一个策略对象,并在适当的时候调用这个策略的算法。
- 具体策略(Concrete Strategy) - 实现了策略接口的具体算法。
策略模式的优点:
- 可以在运行时动态切换不同的算法策略
- 避免使用多重条件判断语句
- 提取公共算法接口
- 新增策略无需修改环境类的代码
下面通过一个支付示例来说明策略模式:
首先定义支付策略接口:
public interface PaymentStrategy {
void pay(int amount);
}
然后实现两种具体策略算法:
public class CreditCardStrategy implements PaymentStrategy {
public void pay(int amount) {
// 使用信用卡支付
}
}
public class BankTransferStrategy implements PaymentStrategy {
public void pay(int amount) {
// 使用银行转账支付
}
}
上下文类维护策略对象:
public class PaymentContext {
private PaymentStrategy strategy;
public PaymentContext(PaymentStrategy strategy) {
this.strategy = strategy;
}
public void executePayment(int amount) {
strategy.pay(amount);
}
}
使用示例:
PaymentContext ctx = new PaymentContext(new CreditCardStrategy());
ctx.executePayment(100);
ctx = new PaymentContext(new BankTransferStrategy());
ctx.executePayment(100);
通过不同构造函数注入不同策略,可以动态改变算法。
策略模式通常会与工厂模式一起使用,工厂类负责创建策略对象,供环境类使用。
还可以使用配置文件等方式注入具体策略,来实现运行时动态切换。