引言
策略模式是一种行为设计模式,它允许在运行时选择算法的行为。在 Java 中,策略模式通过定义一系列的算法,并将每一个算法封装起来,并使它们可以互换,这样算法的变化不会影响到使用算法的客户。本篇博客将深入探讨策略模式的概念、优势以及如何在实际开发中灵活应用这一模式。
策略模式的概念
策略模式定义了一系列的算法,并将每一个算法封装到具有共同接口的独立的类中,使得它们可以互相替换。策略模式让算法的变化独立于使用算法的客户。
核心组成
- 策略接口(Strategy Interface):这是一个接口,定义了所有支持的算法的公共操作。
- 具体策略类(Concrete Strategy Classes):实现策略接口的类,提供具体的算法实现。
- 上下文(Context):使用策略接口的类,不直接实现算法,而是维持一个对策略对象的引用。
策略模式的优势
- 增加灵活性:通过策略模式,可以动态地改变对象的行为。
- 避免多重条件选择语句:策略模式提供了一种用条件语句选择所需行为的替代方法。
- 更好的扩展性:添加新的策略或修改现有策略时无需修改上下文。
实战示例:支付服务策略
场景描述
假设我们正在开发一个电子商务系统,需要实现多种支付方式(如信用卡支付、PayPal支付等)。
示例代码
java复制代码
// 策略接口
interface PaymentStrategy {
public void pay(int amount);
}
// 具体策略类:信用卡支付
class CreditCardStrategy implements PaymentStrategy {
private String name;
private String cardNumber;
CreditCardStrategy(String name, String cardNumber) {
this.name = name;
this.cardNumber = cardNumber;
}
@Override
public void pay(int amount) {
System.out.println(amount + " paid with credit card.");
}
}
// 具体策略类:PayPal支付
class PayPalStrategy implements PaymentStrategy {
private String emailId;
PayPalStrategy(String email) {
this.emailId = email;
}
@Override
public void pay(int amount) {
System.out.println(amount + " paid using PayPal.");
}
}
// 上下文
class ShoppingCart {
private PaymentStrategy paymentStrategy;
// 设置支付策略
public void setPaymentStrategy(PaymentStrategy strategy) {
this.paymentStrategy = strategy;
}
public void checkout(int amount) {
paymentStrategy.pay(amount);
}
}
// 客户端代码
public class StrategyDemo {
public static void main(String[] args) {
ShoppingCart cart = new ShoppingCart();
cart.setPaymentStrategy(new CreditCardStrategy("John Doe", "1234567890123456"));
cart.checkout(100);
cart.setPaymentStrategy(new PayPalStrategy("john@example.com"));
cart.checkout(200);
}
}
代码说明
- 定义策略接口:所有支付策略实现
PaymentStrategy
接口。 - 实现具体策略:通过
CreditCardStrategy
和PayPalStrategy
类实现具体的支付行为。 - 上下文使用策略:
ShoppingCart
类使用PaymentStrategy
,根据不同的需求设置不同的支付策略。