策略+工厂设计模式的应用

问题

比如有下面一段业务,一个自动售货机,根据用户选择不同的饮料,出对应的货

public class NoDesignDemo {public void ifElse(String parameter) {if ("Pepsi".equalsIgnoreCase(parameter)) {System.out.println("百事可乐-初始无设计");}else if ("Coca".equalsIgnoreCase(parameter)){System.out.println("可口可乐-初始无设计");if("618".equalsIgnoreCase(parameter)){//需要配合618积分平台大促活动,涉及复杂业务。}if("1111".equals(parameter)){//需要配合双11优惠卷平台大促活动,涉及复杂业务。//1 MQ同步消息给其它下游系统//2 xxl-job做好定时任务扫描,当晚下单下单顾客,没1分钟统计一次送给QTL系统//3 。。。。。。}}else if ("Wahaha".equalsIgnoreCase(parameter)){System.out.println("娃哈哈-初始无设计");}}public static void main(String[] args){new NoDesignDemo().ifElse("wahaha");}
}

这段代码有什么问题?大家想想。。。
很明显,这代码太耦合,太多if…else现在只写了3个,实际情况可能几十个几百个if…else,每次添加一个新的品类,又需要修改原来代码添加一个if…else

使用策略+工厂模式优化

1、先定义一个策略接口

public interface HandlerStrategyFactory extends InitializingBean
{void getDrink(String parameter);//继承InitializingBean方法后,Spring容器将在bean属性设置完成后自动调用这个方法// void afterPropertiesSet() throws Exception;
}

2、再定义一个饮料工厂

public class DrinkFactory {private static Map<String, HandlerStrategyFactory> strategyMap = new ConcurrentHashMap<>();public static HandlerStrategyFactory getInvokeStrategy(String str){return strategyMap.get(str);}public static void register(String str ,HandlerStrategyFactory handler){System.out.println("str: "+str+"\t handler: "+handler);if (null == str || null == handler){return;}strategyMap.put(str,handler);}
}

3、定义各种饮料的处理方式类

@Component
public class CocaHandler implements HandlerStrategyFactory
{@Overridepublic void getDrink(String parameter){System.out.println("我是可口可乐-策略+工厂 "+parameter);}@Overridepublic void afterPropertiesSet() throws Exception{//K          //VDrinkFactory.register("Coca",this);}
}
@Component
public class PepsiHandler implements HandlerStrategyFactory
{@Overridepublic void getDrink(String parameter){System.out.println("我是百事可乐-策略+工厂 "+parameter);}@Overridepublic void afterPropertiesSet() throws Exception{DrinkFactory.register("Pepsi",this);}
}
@Component
public class WahahaHandler implements HandlerStrategyFactory
{@Overridepublic void getDrink(String parameter){System.out.println("我是娃哈哈可乐-策略+工厂 "+parameter);}@Overridepublic void afterPropertiesSet() throws Exception{DrinkFactory.register("Wahaha",this);}
}

测试

    @Testpublic void invokeStrategyFactory(){String parameter = "Coca";  //Pepsi //CocaHandlerStrategyFactory invokeStrategy = DrinkFactory.getInvokeStrategy(parameter);invokeStrategy.getDrink(parameter);}

这样优化有什么好处?现在新来一个品类,只需要加一个xxxHandler对应的处理方式,其他代码不用修改,代码完全解耦,条理清晰,易于扩展

下课!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/49813.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[ptrade交易实战] 第十八篇 期货查询类函数和期货设置类函数

前言 今天主要和大家分享的是期货查询类的函数和期货设置类的函数&#xff01; 具体的开通渠道可以看文章末尾&#xff01; 一、get_margin_rate—— 获取用户设置的保证金比例 保证金是期货交易中的一个重点&#xff0c;这个函数就是用来获取我们设置的保证金比例的&#…

整合StarRocks主键表全部知识点

总结StarRocks主键表的全部内容的集合&#xff08;V3.2版本&#xff09; 一、基本功能 主键非空约束&#xff0c;任何一个字段都不可以为空支持导入数据时删除数据操作(CDC)支持部分更新支持独立的排序键&#xff08;只有主键表支持独立排序键&#xff0c;而且可以不为key键&…

极限科技闪耀 2024 可信数据库发展大会,多款自研产品引领搜索技术新纪元

北京&#xff0c;7 月 16、17 日 —— 在由中国信息通信研究院&#xff08;中国信通院&#xff09;与中国通信标准化协会联合主办&#xff0c;InfoQ 协办的“2024 可信数据库发展大会”&#xff08;TDBC 2024&#xff09;上&#xff0c;极限科技凭借其前沿的搜索技术创新与卓越…

【相机与图像】1. 相机模型的介绍:内参、外参、畸变参数

想着整理下相机模型&#xff08;内容上参考 slam十四讲&#xff09;、相机的内外参标定。方便自己的使用和回顾。 不过&#xff0c;内外参标定啥时候记录随缘 -_- 概述 【构建相机模型】 相机将三位世界中的坐标点&#xff08;单位为米&#xff09;映射到二维图像平面&#xff…

py Qt5学习记录

1.Qt5的安装 可参考一些博客如&#xff1a;Python 小白从零开始 PyQt5 项目实战&#xff08;2&#xff09;菜单和工具栏_pyqt 二级菜单-CSDN博客 2.Qt5的界面显示 3.新建一个工具栏并打开本地文件方法 &#xff08;1&#xff09;在Qt5界面右下角有个“动作编辑器”&#xff…

学习笔记5:缓存穿透

缓存穿透 缓存穿透是指在缓存系统中&#xff0c;当一个请求的查询结果为空时&#xff0c;这个请求会直接穿透缓存系统&#xff0c;访问后端的数据库。如果这种情况频繁发生&#xff0c;会对数据库造成较大的压力&#xff0c;甚至可能导致数据库崩溃。 在正常情况下&#xff0…

对pytorch optimizer中state_dict、state、param_groups的简要理解

先说结论&#xff1a; state_dict()&#xff1a;一个dict&#xff0c;里面有两个key&#xff08;state和param_groups&#xff09;&#xff0c; state这个key对应的value是各个权重对应的优化器状态。具体来说&#xff0c;一个model有很多权重&#xff0c;model.parameters()会…

MyBatis相关问题汇总

sql预编译原理 https://www.cnblogs.com/Createsequence/p/16963891.html MyBatis一级缓存&二级缓存 mybatis的缓存机制&#xff08;一级缓存二级缓存和刷新缓存&#xff09;和mybatis整合ehcache_mybatis缓存机制-CSDN博客

每日一题~961div2A+B+C(阅读题,思维,数学log)

A 题意&#xff1a;给你 n*n 的表格和k 个筹码。每个格子上至多放一个 问至少占据多少对角线。 显然&#xff0c;要先 格数的多的格子去放。 n n-1 n-2 …1 只有n 的是一个&#xff08;主对角线&#xff09;&#xff0c;其他的是两个。 #include <bits/stdc.h> using na…

基于Java和MySQL的数据库优化技术

基于Java和MySQL的数据库优化技术 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;是个冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将探讨如何基于Java和MySQL进行数据库优化&#xff0c;提升系统的性能和稳定性。我们将从查询优化、索引使用…

管理和迁移Conda环境两种方法:conda env export 和 Conda-Pack

在管理和迁移Conda环境时&#xff0c;通常有两种常用的方法&#xff1a;conda env export 和 Conda-Pack。这两种方法各有优缺点&#xff0c;根据具体需求可以选择合适的方法。 方法一&#xff1a;Conda env export conda env export 是Conda自带的命令&#xff0c;用于导出当…

基于微信小程序图书馆座位预约管理系统设计与实现

1.1选题动因 当前的网络技术&#xff0c;软件技术等都具备成熟的理论基础&#xff0c;市场上也出现各种技术开发的软件&#xff0c;这些软件都被用于各个领域&#xff0c;包括生活和工作的领域。随着电脑和笔记本的广泛运用&#xff0c;以及各种计算机硬件的完善和升级&#x…

JS 事件循环(Event Loop)机制

事件循环机制的作用 事件循环机制是 JS 的一种执行机制&#xff0c;一种可以实现异步编程的机制。 因为 JS 是单线程的&#xff0c;单线程意味着所有任务需要排队执行。但是有一些 API&#xff08;比如&#xff1a;定时器和 Ajax 等&#xff09;是需要等待一定的时间才能得到…

【Python】一文向您详细介绍 K-means 算法

【Python】一文向您详细介绍 K-means 算法 下滑即可查看博客内容 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我静心耕耘深度学习领域、真诚分享知识与智慧的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#xff1a;985高校的普通本硕&#xff…

Visual Studio 2022新建 cmake 工程测试 tensorRT 自带样例 sampleOnnxMNIST

1. 新建 cmake 工程 vs2022_cmake_sampleOnnxMNIST_test( 如何新建 cmake 工程&#xff0c;请参考博客&#xff1a;Visual Studio 2022新建 cmake 工程测试 opencv helloworld ) 2. 删除默认生成的 vs2022_cmake_sampleOnnxMNIST_test.h 头文件 3. 修改默认生成的 vs2022_cma…

【 C语言 】 C语言设计模式

一 、C语言和设计模式&#xff08;继承、封装、多态&#xff09; C有三个最重要的特点&#xff0c;即继承、封装、多态。我发现其实C语言也是可以面向对象的&#xff0c;也是可以应用设计模式的&#xff0c;关键就在于如何实现面向对象语言的三个重要属性。 &#xff08;1&…

BSV区块链在人工智能时代的数字化转型中的角色

​​发表时间&#xff1a;2024年6月13日 企业数字化转型已有约30年的历史&#xff0c;而人工智能&#xff08;以下简称AI&#xff09;将这种转型提升到了一个全新的高度。这并不难理解&#xff0c;因为AI终于使企业能够发挥其潜力&#xff0c;实现更宏大的目标。然而&#xff0…

MySQL中实现动态表单中JSON元素精准匹配的方法

目录 前言 一、动态表单技术 1、包含的主要信息 2、元素属性设置 3、表单内容 二、表单数据存储和查询 1、数据存储 2、数据的查询 3、在5.7版本中进行JSON检索 4、8.0后的优化查询 三、总结 前言 在很多有工作流设置的地方、比如需要在不同的流程中&#xff0c;需要…

什么是跨域问题及其解决方案

什么是跨域问题及其解决方案 在现代Web开发中&#xff0c;跨域问题是一个常见的挑战。了解什么是跨域问题以及如何解决它&#xff0c;对于开发者来说至关重要。在这篇博客中&#xff0c;我们将详细介绍什么是跨域问题&#xff0c;并探讨几种常用的解决方案。 什么是跨域问题&…

Docker 搭建GitLab

# 拉取镜像 docker pull gitlab/gitlab-ce # GitLab 需要持久存储来保存数据&#xff0c;如仓库数据、配置 mkdir -p /opt/gitlab/config /opt/gitlab/logs /opt/gitlab/data # 使用 docker run 命令来启动 GitLab 容器 docker run -itd \--hostname 192.168.111.128 \--p…