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种设计模式概览》

相关推荐
欧阳秦穆18 分钟前
apoc-5.24.0-extended.jar 和 apoc-4.4.0.36-all.jar 啥区别
java·jar
岁忧29 分钟前
(LeetCode 面试经典 150 题 ) 58. 最后一个单词的长度 (字符串)
java·c++·算法·leetcode·面试·go
Java初学者小白33 分钟前
秋招Day14 - Redis - 应用
java·数据库·redis·缓存
代码老y39 分钟前
Spring Boot + 本地部署大模型实现:优化与性能提升
java·spring boot·后端
码农秋42 分钟前
设计模式系列(10):结构型模式 - 桥接模式(Bridge)
设计模式·桥接模式
GodKeyNet43 分钟前
设计模式-桥接模式
java·设计模式·桥接模式
guojl2 小时前
Java多任务编排技术
java
丶意冷2 小时前
mybatisPlus分页方言设置错误问题 mybatisPlus对于Oceanbase的Oracle租户分页识别错误
java·数据库·oracle·oceanbase
要开心吖ZSH2 小时前
《Spring 中上下文传递的那些事儿》Part 4:分布式链路追踪 —— Sleuth + Zipkin 实践
java·分布式·spring
桦说编程2 小时前
深入解析CompletableFuture源码实现
java·性能优化·源码