标签:
1. 适配器模式(Adpater pattern)的定义
(1)将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原来由于接口不兼容而不能一起工作的那些可以一起工作。
(2)适配器模式的结构和说明
①Client客户端,调用自己需要的领域接口Target
②Target:定义客户端需要的跟特定领域相关的接口
③Adaptee:己经存在的接口,通常能满足客户端的功能要求,但接口与客户端要求的特定领域接口不一致,需要被适配。
④Adapter:适配器,把Adaptee适配成Client需要的Target。可分为对象适配器(与Adpatee是组合关系)和类适配器(与Adaptee是继承关系)
(3)思考适配器模式
①适配器模式的本质:转换匹配,复用功能。它通过转换调用己有的实现,从而能把己有的实现匹配成需要的接口,使之能满足客户端的需要。
②Adaptee和Target的关系:被适配的接口Adaptee和适配的目标接口Target是没有关联的,他们可以是完全不同的两个接口。
2. 适配器模式的实现
(1)适配器的常见实现
①适配器通常是一个类,一般会让适配器类去实现Target接口,然后在适配器的具体实现里面调用Adaptee。
②适配器通常是一个Target类型,而不是Adaptee类型(通过组合,而不是继承)
(2)适配多个Adaptee
适配器在适配的时候,可以适配多个Adaptee,也就是说实现某个新的Target功能的时候,需要调用多个模块的功能,适配多个模块的功能才能满足新接口的需要。
(3)缺省适配
缺省适配指的是为一个接口指供缺省的实现,就不用直接去实现接口,而是采用继承这个缺省适配对象,从而让子类可以有选择地去覆盖实现需要的接口,对于不需要的方法,使用缺省适配的方法就可以了。
(4)双向适配器:就是把Adaptee适配成Target,也可以把Target适配成Adaptee。
3. 对象适配器和类适配器
(1)实现上的差异
①对象适配器的实现:依赖于对象组合。即Adapter和Adaptee是组合关系。
②类适配器的实现:采用继承,即Adapter和Adaptee是继承关系,同时Adpater还实现了Target的接口,在C++中表现为多重继承。
(2)类适配器和对象适配器的权衡
①从实现上:类适配器使用对象的继承方式,是静态定义方式;而对象适配器使用对象组合方式,是动态组合的方式。
②对于类适配器,由于Adapter直接继承了Adaptee,使得适配器不能和Adaptee的子类一起工作,因为继承是静态的关系,当适配器继承了Adaptee后,就不能再去处理Adaptee的子类了。
③对于对象适配器,允许一个Adapter和多个Adaptee,包括Adaptee和它所有的子类一起工作。因为对象适配器采用的是对象组合的关系,只要对象类型正确,是不是子类都无所谓。
④对于类适配器,Adapter可以重定义Adaptee的部分行为,相当于子类覆盖父类的部分实现方法。但对于对象适配器,要重定义Adaptee的行为比较困难,这种情况需要定义Adaptee的子类来实现重定义,然后让适配器组合子类。
⑤对于类适配器,仅仅引入了一个对象,并不需要额外的引用来间接得到Apdatee。而对象适配器,需要额外的引用来间接得到Adaptee。
(3)建议:尽量使用对象适配器的实现方法。当然,具体问题具体分析,根据需要来选用实现,最合适的才是最好的。
4. 适配器模式的优缺点
(1)优点
①更好的复用性:如果功能己经有了,只是接口不兼容,那么通过适配器模式就可以让这些功能得到更好的复用。
②更好的扩展性:在实现适配器功能时,可以调用自己开发的功能,从而自然地扩展了系统的功能。
③增加了类的透明性:我们访问的是Target的接口,但是具体的实现都委托给了Adaptee,而这对于高层次模块是透明的,也是它不需要关心的。
(2)缺点
过多地使用适配器,会让系统非常零乱,不容易整体进行把握。如明明看到调用的是A接口,其实内部被适配成B接口来实现。
5. 适配器模式的使用场景
只要记住一点:想要修改一个己经存在的接口时,可以考虑用适配器去转换成需要的接口。
6. 相关模式
(1)适配器模式与桥接模式
①两者结构略为相似,但功能上完全不同
②适配器模式是把两个或多个接口的功能进行转换匹配;而桥接模式是让接口和实现部分相分离,以便它们可以相对独立的变化。
(2)适配器模式与装饰模式
①从某种意义上讲,适配器模式能模拟实现简单装饰模式的功能。在适配前和适配后都可以添加一些功能。
void adapterMethod(){ //在调用Adaptee的方法之前完成一定的工作 //调用Apdatee相关方法 adaptee->method(); //在调用Adaptee的方法之后完成一定的工作 }
②仅仅是类似,造成这种类似的原因是:两种设计模式在实现上都是使用对象的组合,都可以在转调组合对象的功能前后进行一些附加的处理。
③两个模式最大的不同在于:适配器适配过后是需要改变接口的,而装饰模式是不改变接口的,无论多少装饰都是一个接口。
标签:
原文地址:http://www.cnblogs.com/5iedu/p/5514428.html