1.设计意图
(1)适配器模式
结构图:
设计意图:
将一个类的接口转换成另外一个客户希望的接口,分为基于多继承的类适配和基于对象组合的对象适配。
Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。Adapter模式通过类的继承或者对象的组合侧重于转换已有的接口,类适配器采用“多继承”的实现方式,带来了不良的高耦合,所以一般不推荐使用。对象适配器采用“对象组合”的方式,更符合松耦合精神。
例如:笔记本 电源适配器,可以将220v转化为适合笔记本使用的电压。
适用场景:
- 你想使用一个已经存在的类,而它的接口不符合你的需求。
- 你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。
- 你想使用一些已经存在的子类(仅适用于对象Adapter),但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。
(2)装饰器模式
结构图:
设计意图:
根据实际需要,实现运行中动态地给一个对象添加一些额外的职责。
就增加功能来说,Decorator模式相比生成子类更为灵活。Decorator模式采用对象组合而非继承的手法,实现了在运行时动态的扩展对象功能的能力,而且可以根据需要扩展多个功能,避免了单独使用继承带来的“灵活性差”和“多子类衍生问题”。同时它很好地符合面向对象设计原则中“优先使用对象组合而非继承”和“开放-封闭”原则。
例如:一幅画,可以直接挂到墙上,也可以加上框架和镶上玻璃后,再挂到墙上。
适用场景:
- 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
- 处理那些可以撤消的职责。
- 当不能采用生成子类的方法进行扩充时。
- 一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。
- 另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。
(3)代理模式
结构图:
设计意图:
为其他对象提供一种代理以控制对这个对象的访问,解决直接访问某些对象是出现的问题。
例如:律师本身就是我们维权的一个代理!
适用场景:
在需要用比较通用和复杂的对象指针代替简单的指针的时候,使用Proxy模式。
下面是一 些可以使用Proxy模式常见情况:
- 远程代理(Remote Proxy)为一个对象在不同的地址空间提供局部代表。
- 虚代理(Virtual Proxy)根据需要创建开销很大的对象。
- 保护代理(ProtecTIon Proxy)控制对原始对象的访问。保护代理用于对象应该有不同 的访问权限的时候。
智能指引(Smart Reference)取代了简单的指针,它在访问对象时执行一些附加操作。 它的典型用途包括:
- 对指向实际对象的引用计数,这样当该对象没有引用时,可以自动释放它(也称为SmartPointers)。
- 当第一次引用一个持久对象时,将它装入内存。
- 在访问一个实际对象前,检查是否已经锁定了它,以确保其他对象不能改变它。
2.联系与区别
(1)联系:
适配器模式、装饰器模式与代理模式都属于设计模式中的结构型模式,都是通过从程序结构上解决模块之间的耦合问题(结构上进行解耦)。都是基于基本的设计原则,即对扩展开放,对修改关闭。
(2)区别:
- 适配器的特点在于兼容,从代码上的特点来说,适配类与原有的类具有相同的接口,并且持有新的目标对象。就如同一个3孔转2孔的适配器一样,在使用适配器模式的时候,我们必须同时持有原对象,适配对象,目标对象。
- 装饰器模式特点在于增强,即被装饰类和所有的装饰类必须实现同一个接口,而且必须持有被装饰的对象,可以无限装饰。
- 代理模式的特点在于隔离,隔离调用类和被调用类的关系,通过一个代理类去调用。
总的来说就是如下三句话:
- 适配器模式是将一个类(a)通过某种方式转换成另一个类(b)。
- 装饰模式是在一个原有类(a)的基础之上增加了某些新的功能变成另一个类(b)。
- 代理模式是将一个类(a)转换成具体的操作类(b)。
3.总结
- 适配器模式:只需要将原接口转化为客户希望的另一个接口。
- 实现方式:1.继承原类或者实现原接口(类适配) 2.持有原接口的对象,再实现目标接口(对象适配)。
- 代理模式:为其他对象提供一个代理控制对这个对象的访问。
- 和适配器模式最大的区别:代理模式是与原对象实现同一个接口,而适配器类则是匹配新接口,即实现一个新的接口。
- 装饰器模式:必须要有被装饰的类和装饰的类!
- 从对象使用角度来看,代理模式一定是自身持有这个对象,不需要从外部传入。而装饰模式的一定是从外部传入,并且可以没有顺序,按照代码的实际需求随意挑换顺序;
- 从使用上来看,代理模式注重的是隔离限制,让外部不能访问你实际的调用对象,比如权限控制。装饰器模式注重的是功能的拓展,在同一个方法下实现更多的功能。
参考
http://www.elecfans.com/article/83/116/2017/20171018566111.html