Relearning Design Pattern
重学设计模式
单一职责原则
又称单一功能原则,面向对象五个基本原则之一
- 原则定义:一个类应该只有一个发生变化的原因
- 模拟场景:访客用户,普通用户,VIP用户
- 编码实现:if-else,判断实现,不易维护
1 |
|
1 |
|
代码重构
1 |
|
impl包下拆分成三个互不影响的类
1 |
|
1 |
|
1 |
|
1 |
|
开闭原则
软件中的对象(类,模块,函数等)应该对于扩展时开放的,但是对于修改是封闭的
- 开闭原则:扩展开放,修改封闭
- 面积计算:长方形,三角形,圆形
- 编码实现:破坏方法,继承扩展
1 |
|
1 |
|
开闭原则扩展功能
1 |
|
1 |
|
里氏替换原则
继承必须确保超类所拥有的性质在子类中依然成立
- 里氏替换原则:兼容性,维护性,扩展性
- 银行卡:信用卡,储蓄卡,地铁卡
- 编码实现:银行卡类,正向,逆向
1 |
|
1 |
|
1 |
|
抽象提取相同功能
1 |
|
1 |
|
1 |
|
1 |
|
迪米特法则
意义在于降低类之间的耦合。由于每个对象尽量减少对其他对象的了解,因此,很容易使得系统的功能模块功能独立,相互之间不存在(或很少有)依赖关系
- 迪米特法则:最少知道,减少依赖
- 学生成绩&排名:校长,教师,学生,成绩,排名
- 编码实现:高内聚,低耦合
1 |
|
1 |
|
1 |
|
1 |
|
重构,越少人知道越好
1 |
|
1 |
|
1 |
|
1 |
|
接口隔离原则
要求程序员尽量将臃肿庞大的接口拆分为更小的和更具体的接口,让接口中只包含客户感兴趣的方法
- 接口隔离原则:更下的接口,更具体的接口
- 王者荣耀:射箭,隐袭,沉默,眩晕
- 编码实现:高内聚,低耦合
1 |
|
1 |
|
1 |
|
1 |
|
接口单独抽取
1 |
|
1 |
|
1 |
|
1 |
|
实现各个接口
1 |
|
1 |
|
依赖倒置原则
程序要依赖于抽象接口,不要依赖于具体实现。简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合
- 依赖倒置原则:依赖接口,降低耦合
- 用户抽奖:随机抽奖,权重抽奖
- 编码实现:高内聚,低耦合
1 |
|
1 |
|
1 |
|
代码重构
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
工厂方法模式
工厂模式又称工厂方法模式,是一种创建型设计模式,其在父类中提供一个创建对象的方法,允许子类决定实例化对象的类型
- 多种类型商品不同接口,统一发奖服务搭建场景
1 |
|
1 |
|
1 |
|
1 |
|
接口实现
1 |
|
1 |
|
1 |
|
1 |
|
引入工厂模式
1 |
|
1 |
|
抽象工厂模式
围绕一个超级工厂创建其他工厂。该超级工厂又称为其他工厂的工厂。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式
- 替换Redis双集群升级,代理类抽象场景
1 |
|
1 |
|
提供集群
1 |
|
1 |
|
1 |
|
升级
1 |
|
1 |
|
提供适配类
1 |
|
1 |
|
1 |
|
1 |
|
抽象工厂实现
1 |
|
1 |
|
1 |
|
建造者模式
指将一个复杂对象的构造与它的表示分离,是同样的构造过程可以创建不同的表示。它是将一个复杂的对象分解为多个简单的对象,然后一步一步构建而成
- 各项装修物料组合套餐选配场景
1 |
|
1 |
|
1 |
|
原型模式
用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式
- 上机考试多套试,每人题目和答案乱序排列场景
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
单例模式
最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式
- 7种单例模式案例,推荐枚举单例模式
原则
- 私有构造(阻止类被通过常规方法实例化)
- 以静态方法或者枚举返回实例(保证实例的唯一性)
- 确保实例只有一个,尤其是多线程环境(保证在创建实例时的线程安全)
- 确保反序列化时不会重新构建对象(在有序列化反序列化的场景下防止单例被莫名破坏,造成未考虑到的后果)
手段
- 主动处理
- synchronized
- volatitle
- cas
- JVM机制
- 由静态初始化器(在静态字段上或static{}块中的初始化器)初始化数据时
- 访问final字段时
- 在创建线程之前创建对象时
- 线程可以看见它将要处理的对象时
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
适配器模式
将一个类的接口适配成用户所期待的。一个适配允许通常因为接口不兼容而不能在一起工作的类工作在一起,做法是将类自己的接口包裹在一个已存在的类中
- 从多个MQ消息体中,抽取指定字段值场景
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
桥接模式
是一种结构型设计模式,可将一个大类或一系列紧密相关的类拆分为抽象和实现两个独立的层次结构,从而能在开发时分别使用
- 多支付渠道(微信、支付宝)与多支付模式(刷脸、指纹)场景
支付模式
1 |
|
1 |
|
1 |
|
1 |
|
支付渠道
1 |
|
1 |
|
1 |
|
1 |
|
组合模式
也成为整体-部分模式,它的宗旨是通过将单个对象(叶子节点)和组合对象(树枝节点)用相同的接口进行表示,使得客户对单个对象和组合对象的使用具有一致性
- 营销差异化人群发券,决策树引擎搭建场景
充血模型
1 |
|
1 |
|
1 |
|
1 |
|
聚合对象
1 |
|
逻辑处理类
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
装饰器模式
在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式
- SSO单点登录功能扩展,增加拦截用户访问方法范围场景
1 |
|
1 |
|
1 |
|
外观模式
隐藏系统的复杂性,并向客户端提供一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性
- 基于SpringBoot开发门面模式中间件,统一控制接口白名单场景
切面处理白名单
1 |
|
门面自定义注解
1 |
|
获取白名单配置
1 |
|
1 |
|
1 |
|
享元模式
主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结构的方式
- 基于Redis秒杀,提供活动与库存信息查询场景
定义基本信息
1 |
|
1 |
|
模拟Redis
1 |
|
1 |
|
1 |
|
1 |
|
代理模式
一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。在代理模式中,创建具有现有对象的对象,以便向外界提供功能接口
- 模拟mybatis-spring中定义的DAO接口,使用代理类方式操作数据库原理实现场景
1 |
|
1 |
|
1 |
|
1 |
|
责任链模式
为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止
- 模拟618电商大促期间,项目上线流程多级负责人审批场景
1 |
|
1 |
|
实现类
1 |
|
1 |
|
1 |
|
1 |
|
命令模式
将一个请求封装为一个对象,使发出请求的责任和执行请求过程分隔开。这样两者之间通过命令对象进行沟通,便于将命令对象进行储存、传递、调用、增加与管理
- 模拟高档餐厅八大菜系,小二点单厨师烹饪场景
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
迭代器模式
提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示
- 模拟公司组织架构树结构关系,深度迭代遍历人员信息输出场景
1 |
|
定义接口
1 |
|
1 |
|
1 |
|
链路
1 |
|
1 |
|
1 |
|
中介者模式
定义一个中介对象来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。中介者模式又叫调停模式,它是迪米特法则的典型应用
- 按照Mybatis原理手写ORM框架,给JDBC方式操作数据库增加中介者场景
po
1 |
|
1 |
|
dao
1 |
|
1 |
|
ORM框架
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
构建者
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
测试
1 |
|
备忘录模式
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,以便以后当需要时能够将该对象恢复到原先保存的状态
- 模拟互联网系统上线过程中,配置文件回滚场景
1 |
|
1 |
|
创建备忘录
1 |
|
1 |
|
1 |
|
观察者模式
指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式
- 模型类似小客车指标摇号过程,监听消息通知用户中签场景
1 |
|
1 |
|
1 |
|
事件
1 |
|
监听
1 |
|
1 |
|
1 |
|
1 |
|
状态模式
对有状态的对象,把复杂的 “判断逻辑” 提取到不同的状态对象中,允许状态对象在其内部状态发生改变时改变其行为
- 模拟系统营销活动,状态流程审核发布上线场景
1 |
|
1 |
|
状态
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
1 |
|
包装处理
1 |
|
1 |
|
策略模式
指定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理
- 模拟多种营销类型优惠券,折扣金额计算策略场景
1 |
|
实现
1 |
|
1 |
|
1 |
|
1 |
|
管理类
1 |
|
1 |
|
模板模式
指定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不改变该算法结构的情况下重定义该算法的某些特定步骤。它是一种类行为型模式
- 模拟爬虫各类电商商品,生成营销推广海报场景
1 |
|
1 |
|
接口实现
1 |
|
1 |
|
1 |
|
1 |
|
访问者模式
指将作用于某种数据结构中的各元素的操作分离出来封装成独立的类,使其在不改变数据结构的前提下可以添加作用于这些元素的新的操作,为数据结构中的每个元素提供多种访问方式
- 模拟家长与校长,对学生和老师的不同视角信息的访问场景
1 |
|
1 |
|
1 |
|
访问者接口
1 |
|
接口实现
1 |
|
1 |
|
数据视图
1 |
|
测试
1 |
|