1,外观模式(Facade Pattern)
- 定义:又叫门面模式,提供了一个统一的接口,用来访问子系统中的一群接口。外观模式定义了一个高层接口,让子系统更容易使用。和外观模式相关的设计模式有中介者模式。
- 适用场景:子系统越来越复杂,增加外观模式提供简单调用接口。构建多层系统结构,利用外观对象作为每层的入口,简化层间调用。
- 应用实例:
1、去医院看病,可能要去挂号、门诊、划价、取药,让患者或患者家属觉得很复杂,如果有提供接待人员,只让接待人员来处理,就很方便。
2、JAVA 的三层开发模式。
- 缺点:增加子系统,扩展子系统行为容易引入风险,不符合开闭原则。
2,装饰模式(Decorator Pattern)
- 定义:在不改变原有对象的基础之上,将功能附加到对象上。提供了比继承更有弹性的替代方案
(扩展原有对象的功能)
- 使用场景: 1、扩展一个类的功能。 2、动态增加功能,动态撤销。
- 优点:继承的有力补充,比继承灵活,不改变原有对象的情况下给一个对象扩展功能。通过使用不同装饰以及这些装饰类的排列组合,可以实现不同的效果。符合开闭原则。
- 缺点:多层装饰比较复杂。
ShapeDecorator redCircle = new RedShapeDecorator(new Circle()); // 画圆形
ShapeDecorator redRectangle = new RedShapeDecorator(new Rectangle()); // 画方形
3,适配器模式(Adapter Pattern)
- 定义:将一个类的接口转换成客户期望的另一个接口。使原本接口不兼容的类可以一起工作。
- 应用实例:
1,读卡器是作为内存卡和笔记本之间的适配器
2,电源适配器
- 注意事项:适配器不是在详细设计时添加的,而是解决正在服役的项目的问题。
- 缺点:过多地使用适配器,会让系统非常零乱,不易整体进行把握。
4,享元模式(Flyweight Pattern)
- 定义:用于减少创建对象的数量,以减少内存占用和提高性能。其实就是共享对象
- 应用实例:
1,JAVA 中的 String,如果有则返回,如果没有则创建一个字符串保存在字符串缓存池里面。
2,数据库的数据池。
- 优点:大大减少对象的创建,降低系统的内存,使效率提高。
- 缺点:提高了系统的复杂度,做不好的话(划分内外部状态)可能会引起线程安全问题
5,组合模式(Composite Pattern)
- 定义:将对象组合成树形结构以表示“部分 - 整体”的层次结构。组合模式使客户端对单个对象和组合对象保持一致的方式处理。其实就是树形结构
- 应用实例:
1,目录和课程的组合,目录会有好几层最后是课程
2,员工自己的组合,从上到下的组织结构
6,桥接模式(Bridge Pattern)
- 定义:将抽象部分与它的具体实现部分分离,使它们都可以独立地变化。通过组合的方式建立两个类之间联系,而不是继承。
- 注意:对于两个独立变化的维度,使用桥接模式再适合不过了。
- 图解:
首先我们创建了Account,它是这个桥的实现接口,左侧是实现层,右侧是抽象层,桥接模式最重要的就是桥的左侧和右侧划分清楚,然后在Bank抽象类里持有Account接口的引用,这就是桥接模式的核心,通过组合的方式,底下的都是具体的类实现。而且可以一直扩展,这就是桥接模式的精华所在。
7,代理模式(Proxy Pattern)
- 定义:为其他对象提供一种代理以控制对这个对象的访问。
- 何时使用:想在访问一个类时做一些控制。
- 应用: 1、远程代理。 2、虚拟代理。 3、Copy-on-Write 代理。 4、保护(Protect or Access)代理。 5、Cache代理。 6、防火墙(Firewall)代理。 7、同步化(Synchronization)代理。 8、智能引用(Smart Reference)代理。
- 解决:在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,或者需要进程外的访问),直接访问会给使用者或者系统结构带来很多麻烦,我们可以在访问此对象时加上一个对此对象的访问层。
参考学习:菜鸟教程、设计模式-六大原则、设计模式-结构型