当前位置: 首页 > news >正文

策略模式结合模板方法模式

之前学习了策略模式加模板方法模式
策略模式单独详解
模板方法模式单独详解

这里回忆起完全可以进行策略和模板方法模式的组合。

import java.util.HashMap;
import java.util.Map;

// 上下文对象(解决参数传递问题)
class OrderContext {
    private final Map<String, Object> data = new HashMap<>();
    
    public OrderContext put(String key, Object value) {
        data.put(key, value);
        return this;
    }
    
    public <T> T get(String key) {
        return (T) data.get(key);
    }
}

// 策略接口
interface OrderProcessingStrategy {
    boolean validate(OrderContext context);
    boolean processPayment(OrderContext context);
    void beforePayment(OrderContext context);
    void deductInventory(OrderContext context);
    void sendNotification(OrderContext context);
    boolean needSpecialNotification(OrderContext context);
}

// 抽象模板类(现在只包含算法骨架,不包含具体实现)
abstract class OrderProcessor {
    
    protected OrderProcessingStrategy strategy;
    
    public OrderProcessor(OrderProcessingStrategy strategy) {
        this.strategy = strategy;
    }
    
    // 模板方法(final防止子类覆盖)
    public final void processOrder(OrderContext context) {
        if (!strategy.validate(context)) {
            rollback(context);
            return;
        }
        
        strategy.beforePayment(context);
        boolean paymentResult = strategy.processPayment(context);
        
        if (paymentResult) {
            strategy.deductInventory(context);
            if (strategy.needSpecialNotification(context)) {
                strategy.sendNotification(context); // 这里可以假设sendNotification已经根据needSpecialNotification处理过
            } else {
                // 可选:提供一个默认的通知方式,或者不做任何操作
                System.out.println("发送默认通知给用户");
            }
            afterSuccess(context);
        } else {
            handlePaymentFailure(context);
        }
    }
    
    // 公共方法(这些方法现在与策略无关,但仍然是订单处理流程的一部分)
    protected void rollback(OrderContext context) {
        System.out.println("执行订单回滚操作");
    }
    
    protected void handlePaymentFailure(OrderContext context) {
        System.out.println("处理支付失败流程");
    }
    
    protected void afterSuccess(OrderContext context) {
        System.out.println("订单后续处理");
    }
}

// 具体策略实现:团购订单处理
class GroupBuyOrderProcessingStrategy implements OrderProcessingStrategy {
    @Override
    public boolean validate(OrderContext context) {
        Integer groupSize = context.get("groupSize");
        System.out.println("验证团购人数:" + groupSize);
        return groupSize != null && groupSize >= 5;
    }

    @Override
    public boolean processPayment(OrderContext context) {
        System.out.println("执行团购优惠价支付");
        return true;
    }

    @Override
    public void beforePayment(OrderContext context) {
        // 团购一般没有特别的前置支付操作,但可以保留此方法以备扩展
    }

    @Override
    public void deductInventory(OrderContext context) {
        System.out.println("按团购规则扣减库存");
    }

    @Override
    public void sendNotification(OrderContext context) {
        System.out.println("发送团购专属通知");
    }

    @Override
    public boolean needSpecialNotification(OrderContext context) {
        return true;
    }
}

// 具体策略实现:秒杀订单处理
class FlashSaleOrderProcessingStrategy implements OrderProcessingStrategy {
    @Override
    public boolean validate(OrderContext context) {
        System.out.println("验证秒杀资格和库存");
        return true; // 假设秒杀资格和库存验证总是通过,实际情况需要具体实现
    }

    @Override
    public boolean processPayment(OrderContext context) {
        System.out.println("执行秒杀价支付(10秒内完成)");
        return true;
    }

    @Override
    public void beforePayment(OrderContext context) {
        System.out.println("锁定秒杀库存30秒");
    }

    @Override
    public void deductInventory(OrderContext context) {
        System.out.println("按秒杀规则扣减库存");
    }

    @Override
    public void sendNotification(OrderContext context) {
        // 秒杀可以发送特别通知,也可以不发送,或者发送默认通知
        // 这里我们假设发送默认通知(或者在实际应用中根据业务逻辑决定)
        System.out.println("发送默认秒杀通知给用户");
    }

    @Override
    public boolean needSpecialNotification(OrderContext context) {
        return false; // 假设秒杀不需要特别通知,实际情况需要具体实现
    }
}

// 使用示例
public class TemplateMethodPatternWithStrategyExample {
    public static void main(String[] args) {
        // 处理团购订单
        OrderContext groupBuyContext = new OrderContext()
            .put("groupSize", 8)
            .put("productId", 1001);
        
        OrderProcessor groupBuyProcessor = new OrderProcessor(new GroupBuyOrderProcessingStrategy());
        groupBuyProcessor.processOrder(groupBuyContext);

        System.out.println("\n===============\n");
        
        // 处理秒杀订单
        OrderContext flashSaleContext = new OrderContext()
            .put("userId", "u123456")
            .put("flashSaleId", "fs2023");
        
        OrderProcessor flashSaleProcessor = new OrderProcessor(new FlashSaleOrderProcessingStrategy());
        flashSaleProcessor.processOrder(flashSaleContext);
    }
}

总结

上面的模板方法由依赖具体策略变成依赖抽象策略接口interface OrderProcessingStrategy,这里就比较好的结合了两个设计模式。

相关文章:

  • Go语言入门-反射4(动态构建类型)
  • PyCharm Community社区版链接WSL虚拟环境
  • 【笔记ing】AI大模型-01大模型基础综述
  • 医学科研工作者的AI助手:高效生成文献结构图和实验流程图
  • U9新开发webapi无授权
  • 使用Docker创建postgres
  • 智慧医院室内导航系统架构拆解:技术选型与性能攻坚指南
  • ssh警告WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!‌的解决方法
  • 2025 年“认证杯”数学中国数学建模网络挑战赛 A题 小行星轨迹预测
  • Mac 关闭浏览器左右滑动切换页面的问题
  • Java常用安全编码的规范整理及工具
  • jQuery UI 小部件方法调用详解
  • 量子计算未来的潜力和挑战
  • DeepSeek提示词实战大全:提示词合集和使用技巧
  • 速学Android 16新功能:带有进度的通知类型
  • mysql-sql查询结构和执行顺序
  • 【计网】一二章习题
  • C++入门一:C++ 编程概述
  • STM32 基础1
  • 2025年4月7日--4月13日(learn openg+dx+ogre+bullet+ue5肉鸽)
  • 医院导航网站怎么做/百度人工服务电话
  • 宝鸡网站网站建设/如何搜索关键词热度
  • 大连开发区做网站/天津短视频seo
  • 北京西路做网站的公司/成都百度推广电话
  • 南宁市营商环境建设局网站/中文网站排行榜
  • 互联网做视频网站需要许可证吗/网页设计一般用什么软件