飞翔飞翔
主页
  • 计算机基础

    • TCP协议
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
主页
  • 计算机基础

    • TCP协议
  • 数据库

    • SQL教程
  • 编程语言

    • C语言
    • Python2
    • Python3
  • 数据格式

    • JSON教程
  • 工具

    • Markdown指南
  • Git

    • GitFlow
  • Quartz

    • Quartz教程
  • Java

    • Java设计模式
  • 缓存

    • Redis教程
联系
阿里云
  • 前言

    • 1.设计模式导图
  • 第1章 创建型模式

    • 1.单例模式
    • 2.工厂方法模式
    • 3.抽象工厂模式
    • 4.建造者模式
    • 5.原型模式
  • 第2章 结构型模式

    • 1.适配器模式
    • 2.桥接模式
    • 3.组合模式
    • 4.装饰器模式
    • 5.外观模式
    • 6.享元模式
    • 7.代理模式
  • 第3章 行为型模式

    • 1.模板方法模式
    • 2.策略模式
    • 3.命令模式
    • 4.责任链模式
    • 5.中介者模式
    • 6.备忘录模式
    • 7.观察者模式
    • 8.状态模式
    • 9.访问者模式
    • 10.解释器模式
    • 11.迭代器模式

策略模式

概念

策略模式(Strategy Pattern)属于行为型设计模式,通过定义一系列算法(策略),将每个算法封装成独立类,并使它们可以互相替换。这种模式让算法的变化独立于使用它的客户端,提升灵活性和可维护性。

作用

1.消除冗长的条件分支语句(如 if-else 或 switch)。

2.提高代码扩展性,新增策略无需修改现有代码(符合开闭原则)。

场景

1.系统需要支持多种支付方式(微信、支付宝、银联),不同支付方式的处理逻辑不同。

2.需要在运行时动态切换算法,如根据文件类型选择不同的压缩算法。

3.系统中存在大量条件分支语句(如 if-else 或 switch),且各分支逻辑独立、易于扩展时。

举例

以下是使用策略模式实现多支付方式的Java代码示例:

// 策略接口
public interface PaymentStrategy {
    void pay(String orderId, double amount);
}
// 微信支付策略
public class WechatPayStrategy implements PaymentStrategy {
    @Override
    public void pay(String orderId, double amount) {
        System.out.println("微信支付: 订单" + orderId + " 支付金额" + amount);
    }
}
// 支付宝支付策略
public class AlipayStrategy implements PaymentStrategy {
    @Override
    public void pay(String orderId, double amount) {
        System.out.println("支付宝支付: 订单" + orderId + " 支付金额" + amount);
    }
}
// 银联支付策略
public class UnionPayStrategy implements PaymentStrategy {
    @Override
    public void pay(String orderId, double amount) {
        System.out.println("银联支付: 订单" + orderId + " 支付金额" + amount);
    }
}
// 上下文类(封装策略)
public class PaymentContext {
    private PaymentStrategy strategy;

    public void setStrategy(PaymentStrategy strategy) {
        this.strategy = strategy;
    }

    public void executePayment(String orderId, double amount) {
        strategy.pay(orderId, amount);
    }
}

客户端调用:

public class Client {
    public static void main(String[] args) {
        PaymentContext context = new PaymentContext();

        // 微信支付
        context.setStrategy(new WechatPayStrategy());
        context.executePayment("ORDER_001", 100.0);

        // 支付宝支付
        context.setStrategy(new AlipayStrategy());
        context.executePayment("ORDER_002", 200.0);

        // 银联支付
        context.setStrategy(new UnionPayStrategy());
        context.executePayment("ORDER_003", 300.0);
    }
}

控制台输出:

微信支付: 订单ORDER_001 支付金额100.0
支付宝支付: 订单ORDER_002 支付金额200.0
银联支付: 订单ORDER_003 支付金额300.0

反例

不使用策略模式时,通常通过条件分支语句处理多支付方式:

public class PaymentService {
    public void pay(String type, String orderId, double amount) {
        if ("wechat".equals(type)) {
            System.out.println("微信支付: 订单" + orderId + " 支付金额" + amount);
        } else if ("alipay".equals(type)) {
            System.out.println("支付宝支付: 订单" + orderId + " 支付金额" + amount);
        } else if ("unionpay".equals(type)) {
            System.out.println("银联支付: 订单" + orderId + " 支付金额" + amount);
        } else {
            throw new IllegalArgumentException("不支持的支付方式");
        }
    }
}

问题分析:

1.违反开闭原则:新增支付方式需修改pay方法,增加else if分支。

2.代码臃肿:逻辑集中在一个类中,难以维护。

3.复用性差:相同支付逻辑无法被其他模块复用。

原理

策略模式通过定义策略接口,将不同的算法封装到具体的策略类中。上下文类持有策略接口的引用,客户端通过设置不同的策略实例来动态切换算法。这种设计将算法的实现与使用分离,使得算法的变化不会影响客户端代码,同时避免了大量的条件判断语句。

缺点

1.策略类数量可能过多,增加系统复杂度。

2.客户端需要了解不同策略之间的差异,以便选择合适的策略。


总结


策略模式通过将算法封装为独立对象,实现了逻辑解耦和动态切换,显著提升了代码的灵活性和可维护性。在支付场景中,它完美支持多支付方式的扩展,避免了传统实现中的条件分支陷阱。若系统存在类似“多算法变体”需求,策略模式是理想选择。
上一页
1.模板方法模式
下一页
3.命令模式