前提是对设计模式有一定的认识。
1.代理模式
含义
通过继承的方式,控制外界对原对象的访问。代理模式要求代理对象和原对象实现相同的接口(Cglib 通过继承原对象的类实现)。
外界对其不可感知,不知道其实是访问经过了代理对象,到达实际对象。对于外界来讲,只知道代理对象;对于内部来讲,被代理对象所有行为都被拦截,不可以替换、不可以通过外部传入被代理对象。
意图
代理模式在不改变原始类接口的条件下,为原始类定义一个代理类,主要目的是控制访问,而非加强功能,这是它跟装饰器模式最大的不同。主要增强的是非主干或者说非业务性的功能。
比如事务、日志记录、数据库连接等等。
2.桥接模式
含义
两个具备多种变化(即多种实现)的类体系之间的解耦,方便两个体系的扩展导致类膨胀的问题。聚合的实际是两个类体系的最顶上的抽象概念。
两个类体系都可以自有扩展,而不影响原来的使用。因为都是聚合了抽象概念的类或接口。
注:抽象概念代表的不是单一的类或接口,实际是被抽象出的一组可扩展的类库。
原则:“依赖倒转原则"与"开闭原则”。
意图
更关注的是两个体系之间其实是一种整体和部分的关系。
比如《headfirst 设计模式》中提到的鸭子和叫声的关联。定义了鸭子的抽象概念,组合了叫声的抽象概念。
一个鸭子的实现,组合了一种叫声的实现,还可以替换,皮不皮。
-
A 鸭子有 “6“ 叫声,会 “666666”。
-
B 鸭子有 D 叫声,会“dd,各位都是dd”。
鸭子和叫声之间都可以自有扩展、组合。
- 给 A 鸭子也来个 “6“呗,完全没问题。
3.组合模式
类似于 UML 中组合的关系,是一种整体和部分不可分割的概念。
最关键的点,在于使客户端以一致的方式对待单个对象和对象组合。注:实现相同接口
比如命令和宏命令,客户端只在乎执行命令,内部如何执行是命令自己的事。
4.装饰器模式
意图
对原始类功能的增强,是和原功能有相同业务含义的。
装饰类和原对象都继承了同样的对象,并通过聚合的方式管理被装饰的对象或对象组。
方式:继承或关联
原则:组合复用、开闭原则
5.适配器模式
这个区别,最好得去使用意图上去区分。字面理解,认为是为了解决使用类和被使用类之间(比如说项目与第三方类库之间)不兼容的问题而使用的。主要提供跟原始类不同的接口。
像代理和装饰,都是与原始类相同的接口
原则:开闭。
意图
举个不是贴切的例子,第三方接口某个参数使用 String 类型,而在项目中这个对应概念是 Long 类型。通过适配器模式,得到一个适配接口。项目使用这个接口传入 Long,然后内部转化为 String 再调用第三方接口。
为了不让这部分没有业务意义的代码影响业务代码,从而使用。
6.门面模式
防止使用者与多个子系统之间的耦合,通过 Facade 提供完整意义的功能并屏蔽掉复杂的调用关系。
原则: “迪米特原则”。
意图
比如出门 ,要关闭灯、空调、暖气、音箱等等电器。使用者需要一一关闭各个电器,而通过 Facade 提供一个总开关接口,通过 Facade 去一一关闭各个电器。