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

策略模式(Strategy Pattern)

一.策略模式定义

1.Context封装角色

它也叫上下文,起承上启下的封装作用,屏蔽高层模块对策略、算法的直接访问,封装肯存在变化。

2.Strategy抽象策略角色

策略、算法家族的抽象,通常为接口,定义每个策略或算法必须具有的方法和属性。

3.ConcreteStrategy具体策略角色

实现抽象策略中的操作,改了包含具体的实现等算法或业务特色。

二. 示例

1.抽象的策略角色
/*** 抽象策略角色*/
public interface Strategy {/*** 策略模式算法或者业务特色的控制*/void dosomething();}
2.具体策略角色
public class ConcreteStrateg1 implements Strategy{@Overridepublic void dosomething() {//TODO 实现策略或者具体的业务逻辑}
}public class ConcreteStrateg2 implements Strategy{@Overridepublic void dosomething() {//TODO 实现策略或者具体的业务逻辑}
}
3.封装角色
/*** 封装角色*/
public class Context {private Strategy strategy = null;public Context(Strategy strategy) {this.strategy = strategy;}public void doAnything() {this.strategy.dosomething();}
}
4.高层模块使用
public class Client {public static void main(String[] args) {//声明一个具体的策略Strategy strategy = new ConcreteStrateg1();//声明上下文Context context = new Context(strategy);//执行封装后的方法}
}

三.应用场景

1.电商平台购物车渲染
(1)定义购物车渲染枚举
/*** 购物车渲染枚举*/
public enum RenderStepEnums {/*** 购物车渲染枚举*/CHECK_DATA("校验商品"),CHECKED_FILTER("选择商品过滤"),COUPON("优惠券价格渲染"),SKU_PROMOTION("商品促销计算"),FULL_DISCOUNT("满减计算"),SKU_FREIGHT("运费计算"),DISTRIBUTION("分配需要分配的促销金额"),PLATFORM_COMMISSION("平台佣金"),CART_PRICE("购物车金额计算"),CART_SN("交易编号创建");private String distribution;public String getDistribution() {return distribution;}RenderStepEnums(String distribution) {this.distribution = distribution;}
}
(2)抽象购物车渲染步骤策略
/*** 购物车渲染*/
public interface CartRenderStep {/*** 渲染价格步骤** @return 渲染枚举*/RenderStepEnums step();/*** 渲染一笔交易** @param tradeDTO 交易DTO*/void render(Object tradeDTO);}
(3)实现购物车渲染的业务逻辑
/*** 购物车渲染,将购物车中的各个商品,拆分到每个商家,形成购物车VO*/
public class CartPriceRender implements CartRenderStep {@Overridepublic RenderStepEnums step() {return RenderStepEnums.CART_PRICE;}@Overridepublic void render(Object tradeDTO) {//TODO 计算商品价格等}
}
/*** 交易流水号生成*/
public class CartSnRender implements CartRenderStep {@Overridepublic RenderStepEnums step() {return RenderStepEnums.CART_SN;}@Overridepublic void render(Object tradeDTO) {//生成流水号等等}
}
/*** sku 运费计算**/
public class SkuFreightRender implements CartRenderStep {@Overridepublic RenderStepEnums step() {return RenderStepEnums.SKU_FREIGHT;}@Overridepublic void render(TradeDTO tradeDTO) {//收货地址问题处理、校验等//运费模板选择等//选择物流的时候计算价格}
}
(4)封装购物车渲染策略
public class RenderStepContext {/*** spring的直接注入列表就可以了,其他的通过构造函数等方式初始化策略* 购物车渲染步骤*///@Autowiredprivate List<CartRenderStep> cartRenderSteps;public RenderStepContext() {}public RenderStepContext(List<CartRenderStep> cartRenderSteps) {this.cartRenderSteps = cartRenderSteps;}public void renderCartBySteps(Object dto, RenderStepEnums[] renderSteps) {for (RenderStepEnums step : renderSteps) {for (CartRenderStep render : cartRenderSteps) {try {if (render.step().equals(step)) {render.render(dto);}} catch (Exception e) {throw e;}}}}
}
(5)根据业务场景选择策略
/*** 购物车渲染 步骤声明**/
public class RenderStepStatement {/*** 测试*/public static RenderStepEnums[] test = {RenderStepEnums.CART_PRICE,RenderStepEnums.CART_SN};/*** 购物车购物车渲染* 校验商品 》 满优惠渲染  》  渲染优惠  》计算价格*/public static RenderStepEnums[] cartRender = {RenderStepEnums.CHECK_DATA,RenderStepEnums.SKU_PROMOTION,RenderStepEnums.FULL_DISCOUNT,RenderStepEnums.CART_PRICE};/*** 结算页渲染* 过滤选择的商品 》 校验商品 》 满优惠渲染  》  渲染优惠  》* 优惠券渲染  》 计算运费  》  计算价格*/public static RenderStepEnums[] checkedRender = {RenderStepEnums.CHECKED_FILTER,RenderStepEnums.CHECK_DATA,RenderStepEnums.SKU_PROMOTION,RenderStepEnums.FULL_DISCOUNT,RenderStepEnums.COUPON,RenderStepEnums.SKU_FREIGHT,RenderStepEnums.CART_PRICE,};/*** 单个商品优惠,不需要渲染满减优惠* 用于特殊场景:例如积分商品,拼团商品,虚拟商品等等*/public static RenderStepEnums[] checkedSingleRender = {RenderStepEnums.CHECK_DATA,RenderStepEnums.SKU_PROMOTION,RenderStepEnums.COUPON,RenderStepEnums.SKU_FREIGHT,RenderStepEnums.CART_PRICE};/*** 交易创建前渲染* 渲染购物车 生成SN 》分销人员佣金渲染 》平台佣金渲染*/public static RenderStepEnums[] singleTradeRender = {RenderStepEnums.CHECK_DATA,RenderStepEnums.SKU_PROMOTION,RenderStepEnums.SKU_FREIGHT,RenderStepEnums.CART_PRICE,RenderStepEnums.CART_SN,RenderStepEnums.DISTRIBUTION,RenderStepEnums.PLATFORM_COMMISSION};/*** 交易创建前渲染* 渲染购物车 生成SN 》分销人员佣金渲染 》平台佣金渲染*/public static RenderStepEnums[] pintuanTradeRender = {RenderStepEnums.CHECK_DATA,RenderStepEnums.SKU_PROMOTION,RenderStepEnums.COUPON,RenderStepEnums.SKU_FREIGHT,RenderStepEnums.CART_PRICE,RenderStepEnums.CART_SN,RenderStepEnums.DISTRIBUTION,RenderStepEnums.PLATFORM_COMMISSION};/*** 交易创建前渲染* 渲染购物车 生成SN 》分销人员佣金渲染 》平台佣金渲染*/public static RenderStepEnums[] tradeRender = {RenderStepEnums.CHECKED_FILTER,RenderStepEnums.CHECK_DATA,RenderStepEnums.SKU_PROMOTION,RenderStepEnums.FULL_DISCOUNT,RenderStepEnums.COUPON,RenderStepEnums.SKU_FREIGHT,RenderStepEnums.CART_PRICE,RenderStepEnums.CART_SN,RenderStepEnums.DISTRIBUTION,RenderStepEnums.PLATFORM_COMMISSION};
}
(6)高层业务模块使用
public class StrategyTest {public static void main(String[] args) {List<CartRenderStep> stepList = new ArrayList<>();stepList.add(new CartPriceRender());stepList.add(new CartSnRender());RenderStepContext context = new RenderStepContext(stepList);context.renderCartBySteps(new Object(), RenderStepStatement.test);}
}

相关文章:

  • Zilliz 推出 Spark Connector:简化非结构化数据处理流程
  • C++类与对象(中)
  • 软件测试中的压力测试和性能测试区别
  • Python装饰器:让函数更强大
  • java-享元模式
  • 从0到1,AI我来了- (3)AI图片识别的理论知识-I
  • 【Linux】从零开始认识多线程 --- 线程ID
  • .NET Core 发展历程和版本迭代
  • 人工蜂鸟算法(Artificial Hummingbird Algorithm,AHA)及其Python和MATLAB实现
  • HTML前端 盒模型及常见的布局 流式布局 弹性布局 网格布局
  • Linux下git入门操作
  • springboot在加了mapper之后报错
  • 第六章:支持向量机
  • 国科大作业考试资料-人工智能原理与算法-2024新编-第十二次作业整理
  • opencv 按键开启连续截图,并加载提示图片
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • 3.7、@ResponseBody 和 @RestController
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • HTTP 简介
  • Java|序列化异常StreamCorruptedException的解决方法
  • javascript从右向左截取指定位数字符的3种方法
  • Koa2 之文件上传下载
  • Making An Indicator With Pure CSS
  • Netty源码解析1-Buffer
  • React-flux杂记
  • TCP拥塞控制
  • Vue 2.3、2.4 知识点小结
  • 动态规划入门(以爬楼梯为例)
  • 干货 | 以太坊Mist负责人教你建立无服务器应用
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 腾讯优测优分享 | 你是否体验过Android手机插入耳机后仍外放的尴尬?
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • 自动记录MySQL慢查询快照脚本
  • Prometheus VS InfluxDB
  • 国内开源镜像站点
  • ​linux启动进程的方式
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • !!java web学习笔记(一到五)
  • #define用法
  • (JS基础)String 类型
  • (八)Docker网络跨主机通讯vxlan和vlan
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (二)延时任务篇——通过redis的key监听,实现延迟任务实战
  • (回溯) LeetCode 77. 组合
  • (转)重识new
  • (轉貼) UML中文FAQ (OO) (UML)
  • .form文件_一篇文章学会文件上传
  • .gitignore文件设置了忽略但不生效
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .NET MAUI学习笔记——2.构建第一个程序_初级篇
  • .NET 使用 ILRepack 合并多个程序集(替代 ILMerge),避免引入额外的依赖
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理
  • .Net实现SCrypt Hash加密
  • /bin/bash^M: bad interpreter: No such file ordirectory