适配器模式—Head First 设计模式

联系生活中最常见的适配器的例子来讲解会更好理解适配器模式,事实上这个模式是非常简单易懂的。

当我们电脑的插头是二孔的,但是身边只有三孔的插座可以提供给我们用来给电脑充电,这种情况下只需要一个三孔转二孔的适配器就可以完成我们的需求啦!!!!(ps:理论上说一个二孔转三孔的适配器也是可以满足我们的需要的,但是请注意,此时发出充电请求的是我们,我们需要的是二孔插座。而提供给我们的是三孔插座,因此,要将我们所使用的二孔插座视为目标,而将提供给我们的三孔插座示为需要进行转换的对象,这样是不是就更好理解我们转换的目标了呢?)

是的,在上述问题中我们的目标十分明确,就是将三孔插座转换为二孔插座,具体原因在上述的nenote中已经进行了分析。

也就是说我们要把一个三孔插座当成一个二孔插座一样使用,那么怎样实现这样的需求呢?

将三孔插座当作二孔插座一样使用用面向对象的观点就是解释成,在宏观上看,它是一个二孔插座,这样才能满足用户的需求,但是微观上它实际上是一个三孔插座,用对象之间的关系就可以翻译成:我们创建一个三孔插座转二孔插座的适配器,不妨把它称作ThreeAdapter(请使用被适配者的名字命名这个适配器,它表示要把被适配者向目标对象一样的使用而作出适配的适配器),它实现了目标接口(二孔插座的接口),并且拥有一个三孔插座对象的成员变量,这样在创建的时候传入一个被适配者的对象实例,而在适配器类中根据需求,将客户希望对目标对象的操作转换成相应的对适配器对象所拥有的被适配者的相应操作,从宏观上看,用户就像是使用一个他所希望的目标对象一样(用上述的例子解释为:用户可以像使用二孔插座一样使用这个适配器,而不必知道这个适配器中具体封装的是一个什么类型的对象)使用适配器对象完成他所希望能实现的操作。

如果上述的表达还不够清楚,那接下来用UML类图的方式表述适配器模式:

事实上有两种实现适配器模式的方式,一种是通过继承目标对象并组合一个被适配者对象的方式,另一种是同时继承目标对象类和被适配者类。

法1:

适配器模式—Head First 设计模式_第1张图片

法2:
适配器模式—Head First 设计模式_第2张图片

 

        客户使用适配器的过程如下:
1.客户通过目标接口调用适配器的方法对适配器发出请求。

2.适配器使用被适配者接口把请求转换成对被适配者的一个或者多个接口调用。

3.用户接收到调用的结果,但并没有发觉到是适配器所起的作用。

 

下面给出适配器模式的定义

适配器模式将一个接口转换成用户所需要的另一个接口,适配器让原本接口不兼容的类可以合作无间。

 

但是适配器模式的缺点是:当目标接口很大时,适配器要实现的功能也变得很多,实际上适配器中的工作是和目标接口的大小成正比的。

最后,给出两种方式实现的适配器的各自的优缺点:

1.通过组合实现的适配器,拥有一个被适配者的实例,因此不仅可以完成被适配者的类型转换,而且可以完成被适配者的子类的类型转换。而通过多重继承实现的适配器本身作为两个类的子类,他的视角仅是被适配者所有的成员变量和方法,而被适配者的任何子类所添加的新的特性对于该种方式实现的适配器是不可见的。

2.类适配器不需要重新实现它的整个被适配者,而对象适配器因为使用接口实现方式,而接口中所有的方法都是虚函数,所以必须要重新实现目标接口的所有方法。

最后,最后!!!!注意!适配器是为了解决接口匹配问题而有意义的!!!理论上不仅可以完成一对一的接口类型转换,也可以完成多对多的接口类型转换,但是在讨论时我们只回归它最简单最有用的特点来学习!!!

2.

 

 

 

你可能感兴趣的:(Design,Pattern)