设计模式代表了最佳的实践,是软件开发人员在软件开发过程中面临的一般问题的解决方案。笔者初衷用于对整体架构设计理解并记录,毕竟最好的学习就是输出。

欢迎大家访问我的博客,这个又是一个新系列–设计模式。

笔者主要是用于记录自己的学习过程,顺便方便他人。

如果各位宝宝们有建议,欢迎评论在下面留言~

编 号 分 类 设计模式 代码链接(不使用设计模式|使用设计模式)
1 创建者模式 工厂方法模式 点击跳转|点击跳转
2 创建者模式 抽象工厂模式 点击跳转|点击跳转
3 创建者模式 建造者模式 点击跳转|点击跳转
4 创建者模式 原型模式 点击跳转|点击跳转
5 创建者模式 单例模式 点击跳转|点击跳转
6 结构型模式 适配器模式 点击跳转|点击跳转
7 结构型模式 桥接模式 点击跳转|点击跳转
8 结构型模式 组合模式 点击跳转|点击跳转
9 结构型模式 装饰器模式 点击跳转|点击跳转
10 结构型模式 外观模式 点击跳转|点击跳转
11 结构型模式 享元模式 点击跳转|点击跳转
12 结构型模式 代理模式 点击跳转|点击跳转
13 行为模式 责任链模式 点击跳转|点击跳转
14 行为模式 命令模式 点击跳转|点击跳转
15 行为模式 迭代器模式 点击跳转|点击跳转
16 行为模式 中介者模式 点击跳转|点击跳转
17 行为模式 备忘录模式 点击跳转|点击跳转
18 行为模式 观察者模式 点击跳转|点击跳转
19 行为模式 状态模式 点击跳转|点击跳转
20 行为模式 策略模式 点击跳转|点击跳转
21 行为模式 模板模式 点击跳转|点击跳转
22 行为模式 访问者模式 点击跳转|点击跳转

设计模式遵循六⼤大原则;单一职责( ⼀一个类和⽅方法只做⼀一件事 )、里氏替换( 多态,⼦子类可扩展⽗父类 )、依赖 倒置( 细节依赖抽象,下层依赖上层 )、接口隔离( 建⽴立单⼀一接⼝口 )、迪米特原则( 最少知道,降低耦合 )、开闭原则( 抽象架构,扩展实现 ),会在具体的设计模式章节中,进⾏体现。

按照模式可分成三大类:创建者模式、结构型模式、行为模式

创建者模式

这类模式提供创建对象的机制, 能够提升已有代码的灵活性和可复⽤用性。

序 号 类 型 业务场景 实现要点
1 工 厂 方 法 多种类型商品不同接口,统一发奖服务搭建场景 定义一个创建对象的接口,让其子类自己决定实例化哪一个工厂类,工厂模式使其创建过程延迟到子类进行。
2 抽 象 ⼯ ⼚ 替换Redis双集群升级,代理类抽象场景 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
3 建 造 者 各项装修物料料组合套餐选配场景 将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
4 原 型 上机考试多套试,每人题⽬目和答案序排列场景 用原型实例例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
5 单 例例 7种单例模式案 例,Effective Java 作者推荐枚举单例模式 保证一个类仅有一个实例例,并提供一个访问它的全局访问点。

结构型模式

这类模式介绍如何将对象和类组装成较大的结构, 并同时保持结构的灵活和高效。

序 号 类 型 业务场景 实现要点
1 适 配 器 从多个MQ消息体中, 抽取指定字段值场景 将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
2 桥 接 多支付渠道(微信、支付宝)与多支付模式(刷 脸、指纹)场景 将抽象部分与实现部分分离,使它们都可以独立的变化。
3 组 合 营销差异化人群发券, 决策树引擎搭建场景 将对象组合成树形结构以表示"部分-整 体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
4 装 饰 SSO单点登录功能扩 展,增加拦截用户访问方法范围场景 动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。
5 外 观 基于SpringBoot开发门面模式中间件,统一控制接口白名单场景 为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口, 这个接口使得这一子系统更加容易使用。
6 享 元 基于Redis秒杀,提供活动与库存信息查询场景 运用共享技术有效地支持大量细粒度的对象。
7 代 理 模拟mybatis-spring中定义DAO接口,使用代理类方式操作数据库原理实现场景 为其他对象提供一种代理以控制对这个对象的访问。

行为模式

这类模式负责对象间的高效沟通和职责委派。

序 号 类 型 业务场景 实现要点
1 责 任 链 模拟618电商大促期间,项目上线流 程多级负责人审批场景 避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
2 命令 模拟高档餐厅八大菜系,小二点单厨师烹饪场景 将一个请求封装成一个对象,从而使您可以用不同的请求对客户进行参数化。
3 迭 代 器 模拟公司组织架构树结构关系,深度 迭代遍历人员信息输出场景 提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。
4 中 介 者 按照Mybatis原理手写ORM框架,给 JDBC方式操作数据库增加中介者场景 ⽤用一个中介对象来封装一系列的对象交互, 中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
5 备 忘 录 模拟互联网系统上线过程中,配置文件回滚场景 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
6 观 察 者 模拟类似小客车指标摇号过程,监听消息通知用户中签场景 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。
7 状 态 模拟系统营销活动,状态流程审核 发布上线场景 允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。
8 策 略 模拟多种营销类型优惠券,折扣金额计算策略场景 定义一系列的算法,把它们一个封装起来, 并且使它们可相互替换。
9 模 板 模拟爬虫各类电商品,生成营销推 广海报场景 定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
10 访 问 者 模拟家长与校长,对学生和老师的不同视角信息的访问场景 主要将数据结构与数据操作分离。

参考文献

[1] 付政委. 重学Java设计模式[M]. 电子工业出版社, 2021.

[2] 亚历山大·什韦茨,Refactoring.Guru背后的单人乐队.

[3] 程杰, 大话设计模式[M], 清华大学出版社, 2007.

[4] 刘望舒, Android进阶之光[M], 电子工业出版社, 2017.