策略模式是一种行为设计模式,它定义了一系列算法,将每个算法封装成一个对象,并使它们可以相互替换。策略模式允许客户端在运行时选择算法,而不必修改代码。
结构
- 策略接口(Strategy): 定义了一系列算法的接口,所有具体策略类都要实现这个接口。
public interface Strategy {
void performAction();
}
- 具体策略类(Concrete Strategies): 实现了策略接口,定义了具体的算法。
public class ConcreteStrategyA implements Strategy {
public void performAction() {
System.out.println("Using Strategy A");
}
}
public class ConcreteStrategyB implements Strategy {
public void performAction() {
System.out.println("Using Strategy B");
}
}
- 环境类(Context): 包含一个策略对象,维护一个引用指向策略对象,可以根据客户端的需求切换策略。
public class Context {
private Strategy strategy;
public Context(Strategy strategy) {
this.strategy = strategy;
}
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public void execute() {
strategy.performAction();
}
}
优点和缺点
优点:
- 灵活性: 策略模式允许在运行时动态切换算法,提供了更大的灵活性。
- 可维护性: 每个具体策略类都有自己的单独实现,易于维护和扩展。
- 减少条件语句: 策略模式可以减少大量的条件语句,使代码更加清晰和易于理解。
- 提高可测试性: 客户端可以使用不同的策略对象进行单元测试,便于测试和验证各个算法的正确性。
缺点:
- 增加类的数量: 策略模式引入了多个具体策略类,可能会增加类的数量,使得系统更加庞大。
- 客户端需要了解不同策略: 客户端需要了解不同策略的特点,选择合适的策略,可能增加了客户端的复杂性。
示例
以下是一个策略模式的示例,模拟不同的支付方式,包括信用卡支付和支付宝支付。在这个示例中,PaymentStrategy 是策略接口,CreditCardPayment 和 AlipayPayment 是具体策略类,ShoppingCart 是环境类。
// 策略接口
public interface PaymentStrategy {
void pay(int amount);
}
// 具体策略类 - 信用卡支付
public class CreditCardPayment implements PaymentStrategy {
private String cardNumber;
public CreditCardPayment(String cardNumber) {
this.cardNumber = cardNumber;
}
public void pay(int amount) {
System.out.println("Paid " + amount + " dollars with Credit Card (" + cardNumber + ")");
}
}
// 具体策略类 - 支付宝支付
public class AlipayPayment implements PaymentStrategy {
private String account;
public AlipayPayment(String account) {
this.account = account;
}
public void pay(int amount) {
System.out.println("Paid " + amount + " dollars with Alipay (" + account + ")");
}
}
// 环境类
public class ShoppingCart {
private PaymentStrategy paymentStrategy;
public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
this.paymentStrategy = paymentStrategy;
}
public void checkout(int amount) {
paymentStrategy.pay(amount);
}
}
// 客户端代码
public class Main {
public static void main(String[] args) {
ShoppingCart cart = new ShoppingCart();
PaymentStrategy creditCardPayment = new CreditCardPayment("1234-5678-9012-3456");
cart.setPaymentStrategy(creditCardPayment);
cart.checkout(100);
PaymentStrategy alipayPayment = new AlipayPayment("example@example.com");
cart.setPaymentStrategy(alipayPayment);
cart.checkout(200);
}
}
在这个示例中,PaymentStrategy 接口定义了支付策略,CreditCardPayment 和 AlipayPayment 是具体的支付策略类。ShoppingCart 是环境类,它可以根据客户端的选择来切换不同的支付策略。