架构idea-策略模式的设计和使用

策略模式(Strategy),顾名思义就是同一个事件有不同的选择,每一个选择就是一个策略,这些策略又要有共性(同一个接口)

策略模式的设计思想

打个比方,小明同学准备十一假期出门旅行,可以选择的交通工具有地铁,火车,飞机等等, 那我们这里的[同一个事件]指的就是[出门旅行], 那都需要交通工具,这里的[交通工具]就可以理解为一个抽象接口,最后选择地铁,火车,飞机等等就是不同策略的具体实现, 好啦,一个最简单的策略模式类图就可以画出来了:
在这里插入图片描述
小明可以指定他要乘坐的交通工具(new一个实现类的bean),就可以去乘坐啦(调用交通工具接口的run()方法)

但这样貌似还不够智能,小明作为选择困难证患者,他无法很快决定自己的要乘坐哪个交通工具,最好系统可以利用一些客观条件帮他选择出来,比如距离这个条件, 每个策略都设定了自己的距离范围:
地铁: 如果您是市内旅游,请选择我
火车: 如果您是省内旅游,请选择我
飞机: 如果您是长途旅游,请选择我
我们在小明和交通工具接口中间添加一层环境类(context)来为处理选择问题,这样小明只需要输入自己的旅游目的地,就可以快速知道乘坐哪个交通工具啦, 优化一下类图:
在这里插入图片描述
嗯,这样看起来比之前方便太多啦(毕竟不用自己选择了,对选择困难症来说是太大的福音)
好啦,现在无论选择哪种交通工具出行都摆脱不了需要[买票]的步骤,既然这个步骤是每个策略都必须的环境,为什么不添加一个抽象类去统一实现呢?(能写一遍绝不复制3遍),这样即使日后多了[轮船策略]的选择,也不有用考虑这个步骤啦, 让我们把它添加上吧:
在这里插入图片描述
通过三次优化,小明可以顺利出去玩啦,我们也得到了策略模式的通用类图,现在将上面这个图抽象一下,以更加标准的类图重新梳理一次:
在这里插入图片描述
client: 策略模式的客户端调用方
StrategyContext: 策略模式的环境类,用来进行策略的选择和调用——继承ApplicationContextAware接口,在系统启动的时候将各个具体策略类的bean初始化到Map<指定key, 具体策略bean对象>中,运行时根据请求参数获取key,在Map中找到对应的value(即具体策略bean对象),再去调用具体的实现方法
IStrategy: 策略模式接口,定义策略需要实现的方法
AbstractStrategy: 策略模式抽象类,用来处理通用逻辑
ConcreteStrategyX: 具体的策略模式实现类,用来实现具体的方法内容,提供自己对应的key值

来一个场景实战吧

现有一个电商平台,用户可以在上面购买商品并且可以选择不同的支付方式进行支付和购买,针对支付方式的不同,订单的处理流程也是不同的,请用策略模式实现这个场景

0⃣️ 构建订单实体对象模拟入参

在这里定义一个简单的Order对象记录订单信息,记得添加好getter,setter,toString方法,这里就不粘贴过来了

/**
 * 订单实体类
 */
public class Order {
   
    
    private Long orderId;   // 订单号
    
    private String buyer;   // 购买人  
    
    private Long price; // 订单价格
    
    private String payType; // 支付方式
}
1⃣️ 定义策略模式接口
public interface OrderStrategy {
   

    /**
     * 处理订单方法
     */
    void dealOrder(Order order);

    /**
     * 获取当前策略类的key方法
     */
    String getKey();
}
2⃣️ 实现AbstractStrategy类

完成对处理通用逻辑的处理

public abstract class AbstractOrderStrategy implements OrderStrategy {
   

/**
 * 实现OrderStrategy处理接口方法,添加通用逻辑
 */
@Override
public void dealOrder(Order order) {
   

    // 增加通用校验逻辑 - 模拟通用订单处理流程
    if (order.getPrice() == null || order.getPrice() <= 0L) {
   
        System.
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值