策略模式(Strategy Pattern)是一种行为型设计模式,它定义了一系列算法,并将每个算法封装成单独的对象,使它们可以相互替换。策略模式让算法的变化独立于使用算法的客户端。
策略模式涉及三个核心角色:
-
策略接口(Strategy Interface):定义了所有支持的算法的通用接口。它可以是抽象类或者接口,通常包含一个执行算法的方法。
-
具体策略类(Concrete Strategies):实现了策略接口,提供了具体的算法实现。
-
上下文(Context):维护一个对策略对象的引用,并在需要时调用所选的算法。上下文通常会持有一个策略接口的引用,并提供一个方法供客户端设置具体的策略。
策略模式的主要优点包括:
-
算法的独立性:将算法封装成独立的对象,使得它们可以独立于客户端而变化,易于添加、删除或替换算法。
-
可扩展性:可以轻松地新增新的策略类,扩展算法的功能。
-
避免使用条件语句:策略模式可以避免使用大量的条件语句,提高了代码的可读性和可维护性。
-
复用性:策略模式使得算法可以被多个上下文共享使用,提高了代码的复用性。
-
符合开闭原则:由于算法被封装在单独的策略对象中,添加新的策略不会影响现有代码,符合开闭原则。
下面是一个简单的 Java 示例来说明策略模式的应用:
// 策略接口
interface PaymentStrategy {
void pay(double amount);
}
// 具体策略类 - 现金支付策略
class CashPaymentStrategy implements PaymentStrategy {
@Override
public void pay(double amount) {
System.out.println("Paid " + amount + " via cash.");
}
}
// 具体策略类 - 信用卡支付策略
class CreditCardPaymentStrategy implements PaymentStrategy {
private String cardNumber;
private String cvv;
private String expirationDate;
public CreditCardPaymentStrategy(String cardNumber, String cvv, String expirationDate) {
this.cardNumber = cardNumber;
this.cvv = cvv;
this.expirationDate = expirationDate;
}
@Override
public void pay(double amount) {
System.out.println("Paid " + amount + " via credit card.");
System.out.println("Card Number: " + cardNumber);
System.out.println("CVV: " + cvv);
System.out.println("Expiration Date: " + expirationDate);
}
}
// 上下文
class ShoppingCart {
private PaymentStrategy paymentStrategy;
public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
this.paymentStrategy = paymentStrategy;
}
public void checkout(double totalAmount) {
paymentStrategy.pay(totalAmount);
}
}
// 客户端代码
public class Client {
public static void main(String[] args) {
ShoppingCart cart = new ShoppingCart();
// 选择现金支付策略
cart.setPaymentStrategy(new CashPaymentStrategy());
cart.checkout(100.50);
// 选择信用卡支付策略
cart.setPaymentStrategy(new CreditCardPaymentStrategy("1234 5678 9012 3456", "123", "12/25"));
cart.checkout(200.75);
}
}
在这个示例中,PaymentStrategy
是策略接口,定义了支付的通用方法 pay
。CashPaymentStrategy
和 CreditCardPaymentStrategy
是具体的策略类,分别实现了现金支付和信用卡支付的具体逻辑。ShoppingCart
是上下文类,它持有一个 PaymentStrategy
引用,并提供了一个设置支付策略的方法 setPaymentStrategy
和一个结账方法 checkout
。在客户端代码中,我们可以选择不同的支付策略来完成结账操作。
小结:
策略模式是一种行为型设计模式,它通过将算法封装成单独的策略对象,并使得这些策略对象可以相互替换,从而使得算法的变化独立于使用算法的客户端。这种模式能够提高代码的灵活性、可维护性和可扩展性,适用于需要根据不同情况使用不同算法的场景。
总结策略模式的关键点:
-
定义策略接口:策略模式首先要定义一个策略接口,该接口定义了所有支持的算法的通用方法。
-
实现具体策略类:针对不同的算法,需要创建具体的策略类来实现策略接口中的方法。
-
维护上下文:上下文是策略模式中的一个重要角色,它负责维护一个对策略对象的引用,并在需要时调用所选的算法。
-
客户端选择策略:在客户端代码中,根据需求选择合适的策略对象,并将其设置给上下文,从而使得上下文在执行算法时能够调用相应的策略。
通过策略模式,可以避免使用大量的条件语句来选择算法,提高了代码的可读性和可维护性。同时,策略模式也使得算法可以被多个上下文共享使用,提高了代码的复用性。