文章目录
- 概念
- 组成角色
- 相关图示
- 示例代码
- 适用场景
概念
策略模式
(Strategy Pattern)是一种行为设计模式,它定义了一系列的算法,并将每一个算法封装起来,使它们可以相互替换。策略模式使得算法可以独立于使用它的客户端变化。这种模式的主要目的是将算法的定义与使用分离,以提高代码的灵活性和可重用性。
组成角色
- Context(上下文):上下文类,用于维护策略对象的引用。它定义了客户端感兴趣的接口,并提供设置策略对象的方法。
- Strategy(策略):策略接口,定义了所有具体策略类需要实现的方法。客户端可以通过这个接口调用策略实现的算法。
- ConcreteStrategy(具体策略):实现策略接口的具体策略类,每个具体策略类对应一种算法实现。
相关图示
示例代码
// 支付策略接口
interface PaymentStrategy {
void pay(double amount);
}
// 具体策略类:信用卡支付
class CreditCardPaymentStrategy implements PaymentStrategy {
private String name; // 持卡人姓名
private String cardNumber; // 信用卡号
private String cvv; // CVV 安全码
private String expirationDate; // 信用卡过期日期
public CreditCardPaymentStrategy(String name, String cardNumber, String cvv, String expirationDate) {
this.name = name;
this.cardNumber = cardNumber;
this.cvv = cvv;
this.expirationDate = expirationDate;
}
@Override
public void pay(double amount) {
System.out.println("Paying " + amount + " using Credit Card.");
}
}
// 具体策略类:支付宝支付
class AlipayPaymentStrategy implements PaymentStrategy {
private String email; // 支付宝账户邮箱
public AlipayPaymentStrategy(String email) {
this.email = email;
}
@Override
public void pay(double amount) {
System.out.println("Paying " + amount + " using Alipay.");
}
}
// 上下文类
class PaymentContext {
private PaymentStrategy paymentStrategy; // 维护一个支付策略对象的引用
public PaymentContext(PaymentStrategy paymentStrategy) {
this.paymentStrategy = paymentStrategy;
}
public void executePayment(double amount) {
paymentStrategy.pay(amount);
}
}
// 客户端
public class PaymentStrategyDemo {
public static void main(String[] args) {
// 使用信用卡支付
PaymentContext paymentContext = new PaymentContext(new CreditCardPaymentStrategy("John Doe", "1234567890123456", "123", "12/25"));
paymentContext.executePayment(100.0);
// 使用支付宝支付
paymentContext = new PaymentContext(new AlipayPaymentStrategy("john.doe@example.com"));
paymentContext.executePayment(200.0);
}
}
适用场景
- 多个算法互相替换:当你有多个算法,并且这些算法在结构上相似,但是有不同的行为时,可以使用策略模式。通过将每个算法封装在一个具有共同接口的独立类中,可以相互替换这些算法,而不影响使用它们的客户端代码。
- 需要在运行时选择算法:当你希望在运行时根据条件选择不同的算法实现时,策略模式是一个很好的选择。客户端可以根据需要选择合适的策略对象,并通过上下文类将请求委托给这个策略对象。
- 隔离算法的实现和使用:策略模式将算法的定义与使用分离,使得算法可以独立于使用它的客户端进行变化。这有助于提高代码的灵活性和可重用性,减少代码重复,并降低维护成本。
- 避免使用大量条件语句:当你的代码中有许多条件语句,用于根据不同条件选择不同的算法时,可以考虑使用策略模式。策略模式可以将这些条件语句替换为策略对象,从而使代码更加清晰和易于维护。
一些常见的策略模式应用场景包括:
- 不同类型的排序算法(快速排序、归并排序、冒泡排序等)
- 不同的支付方式(信用卡支付、支付宝支付、微信支付等)
- 不同的数据压缩算法(ZIP、RAR、7z等)
- 不同的策略在游戏中(如AI策略、攻击策略、防御策略等)