1、简述
策略模式(Strategy Pattern)是一种行为型设计模式,旨在定义一系列算法,并将它们封装起来,使它们可以互相替换。这种模式让算法的变化不会影响到使用算法的客户端。
设计模式样例:https://gitee.com/lhdxhl/design-pattern-example.git
本文将详细介绍策略模式的概念、结构、优缺点及实际应用案例。
2、什么是策略模式?
策略模式是将不同的算法封装到独立的类中,使其可以相互替换而不影响使用它的客户端代码。它的主要特点是:
- 封装变化:可以在不修改客户端代码的情况下更改算法。
- 开放/关闭原则:通过增加新策略来扩展功能,而不是修改已有代码。
策略模式包含以下三个核心角色:
- 上下文(Context):持有对策略对象的引用。
- 抽象策略(Strategy):定义所有支持的算法的公共接口。
- 具体策略(ConcreteStrategy):实现具体的算法。
类图如下:
Context ----> Strategy
^
|
ConcreteStrategyA, ConcreteStrategyB
3、实际案例
假设一个电商系统需要支持多种支付方式,如支付宝、微信支付和信用卡支付。我们可以使用策略模式来实现。
// 抽象策略接口
public interface PaymentStrategy {
void pay(int amount);
}
// 具体策略:支付宝支付
public class AlipayStrategy implements PaymentStrategy {
@Override
public void pay(int amount) {
System.out.println("使用支付宝支付: " + amount + " 元");
}
}
// 具体策略:微信支付
public class WeChatPayStrategy implements PaymentStrategy {
@Override
public void pay(int amount) {
System.out.println("使用微信支付: " + amount + " 元");
}
}
// 具体策略:信用卡支付
public class CreditCardStrategy implements PaymentStrategy {
private String cardNumber;
public CreditCardStrategy(String cardNumber) {
this.cardNumber = cardNumber;
}
@Override
public void pay(int amount) {
System.out.println("使用信用卡支付: " + amount + " 元,卡号: " + cardNumber);
}
}
// 上下文类
public class PaymentContext {
private PaymentStrategy paymentStrategy;
// 设置支付策略
public void setPaymentStrategy(PaymentStrategy paymentStrategy) {
this.paymentStrategy = paymentStrategy;
}
// 执行支付
public void pay(int amount) {
if (paymentStrategy == null) {
System.out.println("请先设置支付方式!");
} else {
paymentStrategy.pay(amount);
}
}
}
// 测试类
public class StrategyPatternDemo {
public static void main(String[] args) {
PaymentContext context = new PaymentContext();
// 使用支付宝支付
context.setPaymentStrategy(new AlipayStrategy());
context.pay(500);
// 使用微信支付
context.setPaymentStrategy(new WeChatPayStrategy());
context.pay(300);
// 使用信用卡支付
context.setPaymentStrategy(new CreditCardStrategy("1234-5678-9012-3456"));
context.pay(800);
}
}
输出:
使用支付宝支付: 500 元
使用微信支付: 300 元
使用信用卡支付: 800 元,卡号: 1234-5678-9012-3456
4、策略模式的优缺点
优点
- 算法独立:每个策略封装在独立的类中,可以自由扩展和复用。
- 符合开闭原则:可以增加新策略而不影响现有代码。
- 简化代码:消除了使用条件语句选择算法的需求。
缺点
- 类数量增加:每个策略需要一个独立的类,可能会导致类数量增加。
- 上下文需要了解策略:客户端需要知道所有策略并选择适合的策略。
5、应用场景
- 多种算法替换场景:如排序算法(快速排序、冒泡排序等)。
- 需要灵活选择算法时:如支付方式、促销规则。
- 避免使用条件语句:将复杂的条件判断逻辑替换为策略模式。
6、总结
策略模式通过封装算法的变化,将不同的策略算法解耦,为系统提供了很好的扩展性。通过实际应用,如支付系统的实现,能够直观地感受到策略模式在简化代码、提高可维护性方面的价值。
希望本文对您理解和使用策略模式有所帮助!欢迎交流讨论!
评论区