用设计模式搞定女朋友,吃什么火锅,设计模式不香吗
本文源自 公-众-号 IT老哥 的分享
IT老哥,一个在大厂做高级Java开发的程序员,每天分享技术干货文章
老哥哔哔叨
无论是人生还是代码,都面临着很多的选择,代码里面充斥着无数的if
/ else
,人生不也是一样吗?无数的分岔路口,我们无法避免这些选择,但是我们可以更优美的去做选择—设计模式
。
谈恋爱的烦恼
不巧,今天又到了发奖金的时间了,女朋友第一时间过来催债
了。
化悲伤为动力
每次钱包空空如也,就更加刺激我努力写代码,我发现霸王龙
这次居然一口气用了3个if
,有进步啊。但是如果我发的奖金更多,岂不是要说出10几个if
来。不行,我得给她讲讲设计模式
,教育教育
她,告诉她如何干掉代码里的if / else
。
if 伪代码
public String getBonusPlan(Integer bonus) {
if (bonus.equals(100)) {
if (饿了) {
return "吃呷哺火锅";
}
return "在考虑考虑";
} else if (bonus.equals(300)) {
if (饿了) {
return "吃蜀大侠火锅";
}
return "在考虑考虑";
} else if (bonus.equals(500)) {
return "吃海底捞火锅";
}
// 一大波火锅来袭。。。。
}
工厂模式 + 策略模式
这里不是标准的工厂模式,也不是标准的策略模式,是按照业务需要组合两者的使用。这个模式在工作中用到的情况会很多,如果大家有兴趣,我们可以单独写篇文章讲讲工厂和策略设计模式。
策略模式登场
- 首先定义一个总的接口类
// 奖金接口
public interface BonusService {
// 奖金如何使用方法
public String useBonusPlan (Integer bonus);
}
- 奖金使用方式一:去呷哺吃火锅
public class XiabuBonusService implements BonusService {
@Override
public String useBonusPlan(Integer bonus) {
if (饿了) {
return "去呷哺吃" + bonus + "元的火锅";
}
return "在考虑考虑";
}
}
- 奖金使用方式一:去蜀大侠吃火锅
public class ShudaxiaBonusService implements BonusService {
@Override
public String useBonusPlan(Integer bonus) {
if (饿了) {
return "去蜀大侠吃" + bonus + "元的火锅";
}
return "在考虑考虑";
}
}
- 奖金使用方式一:去海底捞吃火锅
public class HaidilaoBonusService implements BonusService {
@Override
public String useBonusPlan(Integer bonus) {
return "去海底捞吃" + bonus + "元的火锅";
}
}
用上策略模式后的变化
public String getBonusPlan(Integer bonus) {
if (bonus.equals(100)) {
XiabuBonusService xiabuBonusService = spring.getBean(XiabuBonusService.class);
return xiabuBonusService.useBonusPlan(bonus);
} else if (bonus.equals(300)) {
ShudaxiaBonusService shudaxiaService = spring.getBean(ShudaxiaBonusService.class);
return shudaxiaService.useBonusPlan(bonus);
} else if (bonus.equals(500)) {
HaidilaoBonusService haidilaoBonusService = spring.getBean(HaidilaoBonusService.class);
return haidilaoBonusService.useBonusPlan(bonus);
}
}
大家可以看到getBonusPlan这个方法可读性好了很多,我们将吃火锅算法
封装到了一个一个的策略类里面,但是对于哪些情况下使用哪种算法的if判断
,并没有减少呀。继续优化代码!
简单工厂设计模式
// 创建一个奖金工厂类
public class BonusStrategyFactory {
// 用map来保存如何使用奖金的策略类
private static Map<Integer, BonusService> strategyMap
= new ConcurrentHashMap<Integer, BonusService>();
// 通过奖金多少查找对应的使用策略
public static BonusService getByBonus(Integer bonus){
return strategyMap.get(bonus);
}
// 将奖金和对应的使用策略注册到map里
public static void register(Integer bonus, BonusService bonusService){
Assert.notNull(bonus,"bonus can't be null");
strategyMap.put(bonus, bonusService);
}
}
加上工厂设计模式后,代码的变化
public String getBonusPlan(Integer bonus) {
// 在工厂里通过奖金拿到对应的使用策略类
BonusService strategyService = BonusStrategyFactory.getByBonus(bonus);
// 调用策略类相应的方法
return strategyService.getBonusPlan(bonus);
}
大家可以看到,策略设计模式 + 工厂设计模式
,让我们的代码十分简洁,唯一的缺憾就是多了一些策略类,但是非常的解耦
,以上代码只是演示伪代码
。在真实复杂
的业务场景中,设计模式能发挥非常重要的作用。
将策略注册到Map中
我们利用spring的InitializingBean这个接口来实现,拿蜀大侠
那个类来举例。
云服务器,云硬盘,数据库(包括MySQL、Redis、MongoDB、SQL Server),CDN流量包,短信流量包,cos资源包,消息队列ckafka,点播资源包,实时音视频套餐,网站管家(WAF),大禹BGP高防(包含高防包及高防IP),云解析,SSL证书,手游安全MTP,移动应用安全、 云直播等等。
public class ShudaxiaBonusService implements BonusService, InitializingBean {
@Override
public String useBonusPlan(Integer bonus) {
if (饿了) {
return "去蜀大侠吃" + bonus + "元的火锅";
}
return "在考虑考虑";
}
@Override
public void afterPropertiesSet() throws Exception {
// 注册到Map中
BonusStrategyFactory.register(300, this);
}
}
- Python机器学习中的特征选择
- Android学习第八弹之改变状态栏的颜色使其与APP风格一体化
- 手把手教你 MongoDB 的安装与详细使用(二)
- 搭建 MongoDB分片(sharding) / 分区 / 集群环境
- Android调用手机中的应用市场,去评分的功能实现
- ANR 原理与实战技巧
- Android将应用程序的崩溃信息如何保存到本地文件,并上传至服务器
- android native内存检测方案(二)
- 测试数据集与验证数据集之间有什么区别呢?
- 深度学习的未来
- SDL系列讲解(二) 环境搭建
- SDL系列讲解(四) demo讲解
- 具有张量流的混合密度网络
- SDL系列讲解(七) SDL_image教程
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- CentOS7下安装Elasticsearch-7.3.2和Elasticsearch-head
- spring boot oauth2 取消认证
- 日志级别记录规范
- 搭建K8S集群之node节点部署
- ent orm笔记2---schema使用(上)
- ent orm笔记4---Code Generation
- 什么?明明是2020年12月30日显示2021年12月30日?
- JDK1.8HashMap源码学习-数据结构
- JDK1.8HashMap源码学习-初始化
- JDK1.8HashMap源码学习-put操作以及扩容(一)
- 数据科学家极力推荐核心计算工具-Numpy的前世今生(上)
- 什么是运维眼中可部署的软件架构
- 2020-09-03:裸写算法:回形矩阵遍历。
- Java并发编程系列34 | 深入理解线程池(下)
- MySQL 8.0新特性 — 密码管理