2. Façade 外观模式
为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
看图说话:
此模式的具体体在: MVC 中 service 层中某个 service 对 dao 层的封装, JDBC 对各个数据库的封装。
3. Proxy 代理模式
为其他对象提供一种代理,以控制对这个对象的访问。
看图说话:
代理对象中保存被代理对象的引用,在调用被代理对象过程中可以附加操作。
使用场合:远程代理;虚拟代理 ( 异步调用被代理对象的方法 ) ;安全代理;只能指引。不管什么场合都要是要在被代理对象上附加操作。
4. Adapter 适配器模式
将一个类的接口转换成客户希望的另外一个接口。 Adaper 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
看图说话:
适配器通过继承目标对象并隐含被适配者的真正实现来达到目标操作与被适配者
的兼容合作。
5. Composite 组合模式
将对象组合成树形结构以表示“部分—整体”的层次结构。组合模式使得用户对单
个对象和组合对象的使用具有一致性。
看图说话:
实例应用: JUnit 的 Test 接口中及 TestCase 、 TestSuite 子类的结构即为组合模式。
适用于树形结构,集合结构。
实现方式有两种:透明方式与安全方式
透明方式:上图的结构为透明方式,即在 Component 中管理子类对象的增减,问题是 Leaf 不应具有增减子类对象的功能。
安全方式:将增减子类的功能放在 Composite 中实现。解决了叶子节点的问题,但客户端就要做出相应的判断。
JUnit3.8 使用的是安全方式。
6. Decorator 装饰模式(油漆工模式)
动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
看图说话:
装饰者可以有自己的状态和新的行为,只关心自己的变化,封装了具体被装饰的对象的行为。注意 decorate 方法的使用。
与 Proxy 对比,
A .一般代理模式中被代理对象是不被客户端知道的,在代理对象初始化时或之前就已初始化好了的。而装饰模式要知道具体的被装饰对象及装饰流程,被装饰对象是通过 decorate 方法传递给装饰者的。
B .代理对象一般不多,而装饰者一般较多。
7 . Bridge 桥接模式
将抽象部分与它的实现部分分离,使它们都可以独立地变化。
看图说话:
A .什么样的事物适合它的抽象与实现相分离?
注解:
复杂事物。
那有多复杂?这里涉及到个数学问题
我们假设看上面的每个抽象与它的实现都有一种组合关系,且有两个具体的抽
象,两个具体的实现。
如果使用 Bridge 模式,那么需要四个类来完成 2+2=4 ,
如果使用继承的方式实现也需要四个类来完成 2 × 2=4 。
所以可以知道,当具体的抽象和具体的实现组合数大于 4 时,使用桥接模式是
多么节省资源。
B .抽象与实现分离有什么好处?
注解:
各自任意变化,且可以任意的组合。就像电脑的硬件可以是任意厂商的,软件
可以是任意人开发的,但都可以相互组合一样。
C .具体应用的体现。
MVC 的 Service 层和 Dao 层之间可以看作桥接模式的体现,之前说过 Service 层
的某个 Service 对 Dao 的封装可以视为 Façade 模式,那么此时桥接模式就可以看作是
多个 Façade 的集合。
8. Flyweight 亨元模式
运用共享技术有效地支持大量细粒度的对象,避免大量拥有相同内容的小类的开销,使大家共享一个元类。
看图说话:
A .当有当量的相似对象存在时,要抽象出相似的部分作为“元类”共享,让差异
部分可以通过传参的形式传入到共享对象的方法中来达到差异操作。
B .注意关键点是 FlyweightFacory 的实现,通过它来达到共享的目的。
C .优缺点 :
优点: Flyweight 模式是一个提高程序效率和性能的模式 , 会大大加快程
序的运行速度 . 应用场合很多