土豆兄弟
ee0e9609f7
1. 状态,访问者,责任链模式 2. 装饰者,适配器,享元,组合模式 - ps : 组合模式还需要进一步学习下 |
3 years ago | |
---|---|---|
.. | ||
src/main/java/com/baiye/design | 3 years ago | |
.gitignore | 3 years ago | |
README.md | 3 years ago | |
pom.xml | 3 years ago |
README.md
设计模式
7大设计原则
开闭原则
依赖倒置原则
单一职责原则
接口隔离原则
迪米特原则
里氏替换原则
合成复用原则
设计模式 - 创建型模式
工厂模式,抽象工厂模式,建造者模式,单例模式,原型模式
设计模式 - 结构型模式
适配器模式,装饰者模式,代理模式,外观模式,桥接模式,组合模式,享元模式
设计模式 - 行为型模式
策略模式,观察者模式,责任链模式,备忘录模式,模板方法模式,迭代器模式,中介者模式,命令模式,访问者模式,解释器模式,状态模式
UML类图
- 记忆技巧
- 箭头方向 子类指向父类
- 实线继承 | 虚线实现(空心箭头)
- 实线关联 | 虚线依赖
- 空心菱形-聚合 | 实心菱形-组合
UML时序图
- 记忆技巧
- 实心箭头-同步调用
- 线箭头-异步调用
- 虚线箭头-返回
UML类图讲解
软件设计七大原则
装饰者模式
1 定义与类型
定义: 在不改变原有对象的基础上,架构功能附加到对象上 提供了比继承更有弹性的替代方案(扩展原有对象功能) 类型:结构型
2 适用场景
扩展一个类的功能或者给一个类添加附加职责 动态的给一个对象添加功能,这些功能可以再动态的撤销
3 优点
继承的有力补充,比继承灵活,不改变原有对象的情况下给一个对象扩展功能 通过使用不同装饰类及这些装饰类的排列组合,可以实现不同效果 符合开闭原则
4 缺点
会出现更多的代码,更多的类,增加程序的复杂性 动态装饰时,多层装饰时会更复杂
5 相关的设计模式
装饰者模式和代理模式 - 装饰者模式: 关注在一个对象上动态的添加方法 - 代理模式: 关注控制对对象的访问 装饰者模式和适配器模式 - 装饰者模式:装饰者和被装饰者实现相同的接口或装饰者是被装饰者的子类,(也可以退化成半装饰者,装饰者还提供了其他的方法,但是不常用) - 适配器模式: 适配器和被适配的类有不同的接口,也可能有部分的接口是重合的
6 代码
com.baiye.design.structural.decorator
7 总结
以 Wapper 结尾的可能是装饰者或者适配器模式,具体看结构
适配器模式
1 定义和类型
定义: 将一个类的接口转换成客户期望的另一个接口 使原本接口不兼容的类可以一起工作 类型:结构型
2 适用场景
已经存在的类,它的方法和需求不匹配时(方法结果相同或相似) 不是软件设计阶段考虑的设计模式,是随着软件维护,由于不同产品,不同厂家造成功能类似而接口不相同情况下的解决方案
3 优点
能提高类的透明性和复用性,现有的类复用但不需要改变 目标类和适配器类解耦,提高程序的扩展性 符合开闭原则
4 缺点
适配器模式编写过程需要全面考虑,可能会增加系统的复杂性 增加系统代码可读的难度
5 扩展
对象适配器 类适配器
6 相关的设计模式
适配器和外观模式 - 外观是定义新的接口,适配器是复用一个原有的接口,适配器是让两个接口协同工作,外观是在现有的系统中提供一个访问入口
7 代码
com.baiye.design.structural.adapter
享元模式
1 定义和类型
定义:提供了减少对象数量从而改善应用所需对象结构的方式 运用共享技术有效地支持大量细粒度的对象 类型: 结构型
2 使用场景
常常应用于系统底层的开发,以便解决系统的性能问题 系统有大量相似对象,需要缓冲池的场景
3 优点
减少对象的创建,降低内存中对象的数量,降低系统的内存,提高效率 减少内存之外的其他资源占用
4 缺点
关注 内部/外部状态,关注线程安全问题 使系统,程序的逻辑复杂化
5 扩展
内部状态 外部状态
6 相关的设计模式
享元模式和代理模式 享元模式和单例模式
组合模式
1 定义和类型
定义:将对象组合成树形结构以表示“部分-整体”的层次结构 组合模式使客户端对单个对象和组合对象保持一致的方式处理 类型:结构型
2 适用场景
希望客户端可以忽略组合对象与单个对象的差异时 处理一个树形结构时
3 优点
清除地定义分层次的复杂对象,表示对象的全部或部分层次 让客户端忽略了层次的差异,方便对整个层次结构进行控制 简化客户端代码 符合开闭原则
4 缺点
限制类型时会较为复杂 使设计变得更加抽象
5 组合模式的相关设计模式
组合模式和访问者模式 - 使用访问者模式可以访问组合模式中的递归结构
6 代码
com.baiye.design.structural.composite
责任链模式
1 定义与类型
为请求创建一个接收此次请求对象的链 类型: 行为型
2 使用场景
一个请求的处理需要多个对象当中的一个或多个协作处理
3 优点
请求的发送者和接收者(请求的处理)解耦 责任链可以动态组合
4 缺点
责任链太长或者处理时间过长,影响性能 责任链有可能过多
5 相关的设计模式
责任链模式和状态模式 - 责任链模式不指定下一个处理的对象 - 状态模式是知道自己处理的下一个对象是谁
6 代码
com.baiye.design.behavioral.chainofresponsibility
7 总结
责任链 -> 流程引擎 一般责任链模式的都以Chain结尾
访问者模式
1 定义与类型
封装作用于某数据结构(如List/Set/Map等)中的各元素的操作 可以在不改变各元素类的前提下,定义作用于这些元素的操作 类型:行为型
2 适用场景
当一个数据结构(List/Set/Map等)包含很多类型对象 数据结构与数据操作分离
3 优点
增加新的操作很容易,即增加一个新的访问者
4 缺点
增加新的数据结构困难 具体元素的变更比较麻烦
5 相关设计模式
访问者模式和迭代器模式 - 都是在某种数据结构上进行处理 - 访问者模式在对保存在数据结构中的元素进行某种特定处理 - 迭代器模式是逐步遍历保存在数据结构中的元素
6 coding
com.baiye.design.behavioral.visitor
7 总结
不同角色的人对数据的访问不同 一般以Visitor结尾的各种类
状态模式
1 定义与类型
允许一个对象在其内部状态改变时,改变他的行为 类型: 行为型
2 使用场景
一个对象存在多个状态(不同状态下行为不同),且状态可相互转换
3 优点
将不同的状态隔离 把各种状态的转换逻辑,分布到State的子类中,减少相互间依赖 增加新的状态非常简单
4 缺点
状态多的业务场景导致类的数目增加,系统变复杂
5 相关的设计模式
状态模式和享元模式 - 使用享元模式在多个状态上下文中共享这个模式
6 coding
com.baiye.design.behavioral.state
7 总结
多个状态 -> 状态模式解决 -> 借助 状态机 解决