Java 编程之策略模式详解

一、策略模式

策略模式(Strategy Pattern)是一种行为型设计模式,它将一组算法或行为封装成独立的类,使它们可以在运行时互相替换。

这让你在使用它们时,无需关心内部实现,只要"调度策略"即可。

外卖平台下单时,你可以选择专送、自取、商家送,每种方式都是不同的策略,但送达的目的相同。


二、举例说明

外卖的"配送方式"就是策略!在美团 / 饿了么平台点外卖时,配送方式多种多样:

  • 骑手专送:平台调度骑手
  • 商家自送:由商家安排送货
  • 自取:用户自己去拿

这些方式结构不同、流程不同,但都完成一件事------送达订单

这就非常符合策略模式的核心思想:一组互换的算法 / 行为,独立封装,灵活切换


三、代码实现

3.1. 策略接口

java 复制代码
// 配送策略接口
public interface DeliveryStrategy {
    void deliver(String orderId);
}

解释

每种配送方式都得遵守"deliver(订单)"这个协议,无论内部如何送。


3.2. 具体实现

java 复制代码
public class RiderDelivery implements DeliveryStrategy {
    @Override
    public void deliver(String orderId) {
        System.out.println("订单 " + orderId + " 由平台骑手专送");
    }
}

public class MerchantDelivery implements DeliveryStrategy {
    @Override
    public void deliver(String orderId) {
        System.out.println("订单 " + orderId + " 商家自行配送");
    }
}

public class SelfPickup implements DeliveryStrategy {
    @Override
    public void deliver(String orderId) {
        System.out.println("订单 " + orderId + " 用户到店自取");
    }
}

解释

每个策略对应一种配送方式,具体送法不同,但结构统一。


3.3. 上下文类

java 复制代码
public class OrderContext {
    private DeliveryStrategy strategy;

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

    public void processOrder(String orderId) {
        if (strategy == null) {
            throw new IllegalStateException("未设置配送策略");
        }
        strategy.deliver(orderId);
    }
}

解释

外卖系统的订单上下文,可以按需设置当前的配送方式并执行。


3.4. 使用示例

用户选择配送方式

java 复制代码
public class Main {
    public static void main(String[] args) {
        OrderContext context = new OrderContext();

        context.setStrategy(new RiderDelivery());
        context.processOrder("10086");

        context.setStrategy(new MerchantDelivery());
        context.processOrder("10087");

        context.setStrategy(new SelfPickup());
        context.processOrder("10088");
    }
}

输出:

复制代码
订单 10086 由平台骑手专送  
订单 10087 商家自行配送  
订单 10088 用户到店自取  

四、策略模式结构图(UML)

plantuml 复制代码
@startuml
interface DeliveryStrategy {
  +deliver(orderId)
}

class RiderDelivery implements DeliveryStrategy
class SelfPickup implements DeliveryStrategy
class MerchantDelivery implements DeliveryStrategy

class OrderContext {
  - strategy: DeliveryStrategy
  + setStrategy(DeliveryStrategy)
  + processOrder(orderId)
}

DeliveryStrategy <|.. RiderDelivery
DeliveryStrategy <|.. SelfPickup
DeliveryStrategy <|.. MerchantDelivery
OrderContext --> DeliveryStrategy
@enduml

核心关系:

  • 所有策略实现 DeliveryStrategy
  • OrderContext 中组合一个策略对象,并调用其 deliver 方法

五、策略模式优点总结

优点 描述
解耦行为 将行为与上下文分离,低耦合高内聚
易于扩展 新增策略无需改动上下文
替代 if-else 取代多分支逻辑,结构清晰
满足开闭原则 封闭修改,开放扩展

"行为可插拔,运行可替换,逻辑高解耦。"

------ 不动主程序,只换策略模块,系统稳定又灵活。

六、实际使用场景

策略模式在很多业务中都有应用:

  • 支付方式:微信 / 支付宝 / 银行卡
  • 认证方式:密码登录 / 验证码登录 / 三方授权
  • 推荐算法:基于标签 / 基于历史 / 基于兴趣图谱
  • 缓存策略:本地优先 / 远程优先 / 混合缓存

七、升级写法:Java 8 Lambda 版(简洁优雅)

策略接口只有一个方法?可以用 Java 8 Lambda 简写!

java 复制代码
OrderContext context = new OrderContext();
context.setStrategy(orderId -> System.out.println("极速达配送:" + orderId));
context.processOrder("10100");

八、策略模式 vs 状态模式 区别一图解

比较点 策略模式 状态模式
意图 算法互换 状态驱动行为
控制者 外部设置策略 内部自动切换
行为绑定 手动设置 状态迁移
示例 支付策略 订单状态变更

九、参考

《23种设计模式概览》

相关推荐
likuolei1 小时前
XML 元素 vs. 属性
xml·java·开发语言
自不量力的A同学1 小时前
Spring Boot 4.0.0 正式发布
java·spring boot·后端
d***29241 小时前
【spring】Spring事件监听器ApplicationListener的使用与源码分析
java·后端·spring
5***b971 小时前
解决报错net.sf.jsqlparser.statement.select.SelectBody
java
q***95221 小时前
Tomcat下载,安装,配置终极版(2024)
java·tomcat
2***d8851 小时前
详解tomcat中的jmx监控
java·tomcat
无敌最俊朗@2 小时前
Qt事件循环队列剖析!!!
java
v***5652 小时前
Spring Cloud Gateway 整合Spring Security
java·后端·spring
兵bing2 小时前
设计模式-访问者模式
设计模式·访问者模式
python零基础入门小白2 小时前
【万字长文】大模型应用开发:意图路由与查询重写设计模式(从入门到精通)
java·开发语言·设计模式·语言模型·架构·大模型应用开发·大模型学习