一、组合模式(Composite)
常用指数:★★★★★
定义
将对象以树形结构组织起来,以达成“部分-整体” 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性.
UML
好处
使得客户端把一个个单独的成分对象和由他们复合而成的合成对象同等看待
实例
windows文件系统
二、外观模式(Facade)
常用指数:★★★★★
定义
为子系统中的一组接口提供一致的界面,facade提供了一高层接口,这个接口使得子系统更容易使用。
UML
好处
为复杂的子系统提供一个简单的接口,大大降低了耦合度
实例
JDBC中,只用调用其中的接口,而不必关系内部的具体的实现与具体的调用流程。
三、代理模式(Proxy)
常用指数:★★★★★
定义
为其他对象提供一种代理以控制对这个对象的访问
UML
优点
(1).职责清晰
真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。
(2).代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了的作用和保护了目标对象的作用。
(3).高扩展性
小节
简单来说,代理模式就是把对代理类的操作变成对被代理类的操作
例子
VPN
四、适配器模式(Adapter)
常用指数:★★★★
定义
将一类的接口转换成客户希望的另外一个接口,Adapter模式使得原本由于接口不兼容而不能一起工作那些类可以一起工作。
UML
优点
1.增加了类的复用性
2.将目标类和适配者类解耦
小结
适配器有两种方式:组合(composition)和继承(inheritance).但是个人觉得组合比继承方便(谁叫java只支持单继承)
与代理模式比较,相同点:代理类包含被代理类,适配器类包含适配者类。
不同点:被代理类也继承目标类,适配者类和目标类没人关系。
简单来说就是,适配器模式把一个类变成了另外一个类。
与外观模式比较:相同点都是复用已有代码
不同点:外观模式是通过定义一个新的接口,而适配器是复用已有接口
例子
充电器。
五、装饰模式(Decorator)
常用指数:★★★★
定义
动态地给一个对象增加一些额外的职责,就增加的功能来说,Decorator模式相比生成子类更加灵活。
UML
小结
Decorator模式与继承关系的目的都是要扩展对象的功能,但是Decorator可以提供比继承更多的灵活性。但也同时意味着更加多的复杂性。
与代理模式的异同:
对装饰器模式来说,装饰者(decorator)和被装饰者(decoratee)都实现同一个 接口。对代理模式来说,代理类(proxy class)和真实处理的类(real class)都实现同一个接口。此外,不论我们使用哪一个模式,都可以很容易地在真实对象的方法前面或者后面加上自定义的方法。
然而,实际上,在装饰器模式和代理模式之间还是有很多差别的。装饰器模式关注于在一个对象上动态的添加方法,然而代理模式关注于控制对对象的访问。换句话 说,用代理模式,代理类(proxy class)可以对它的客户隐藏一个对象的具体信息。因此,当使用代理模式的时候,我们常常在一个代理类中创建一个对象的实例。并且,当我们使用装饰器模 式的时候,我们通常的做法是将原始对象作为一个参数传给装饰者的构造器。
我们可以用另外一句话来总结这些差别:使用代理模式,代理和真实对象之间的的关系通常在编译时就已经确定了,而装饰者能够在运行时递归地被构造。
例子
java.io
六、桥接模式(Bridge)
常用指数:★★★
定义
将抽象部分与它的实现部分相分离,使他们可以独立的变化。
UML
小节
与适配器模式的异同
相同点都是都是让两个功能模块配合工作,给另一对象提供了一定程度上的间接性
不同点:当你发现两个不兼容的类必须同时工作时,就有必要使用Adapter模式,其目的一般是为了避免代码重复。此处耦合不可预见。相反, Bridge的使用者必须事先知道:一个抽象将有多个实现部分,并且抽象和实现两者是独立演化的。Adapter模式在类已经设计好后实施;而Bridge模式在设计类之前实施。
七、享元模式(Flyweight)
常用指数:★★
定义
享元模式以共享的方式高效的支持大量的细粒度对象。享元模式能做到共享的关键是区分内蕴状态和外蕴状态。内蕴状态存储在享元内部,不会随环境的改变而有所不同。外蕴状态是随环境的改变而改变的。
UML
小节
采用共享技术来避免大量拥有相同内容对象的开销。但是一般是用于后期代码优化的时候。