适配器模式
一、对象适配器(关联委派)
1、被适配者类Adaptee:原有的属性和方法。
2、目标接口Target:新增一些方法。
3、适配器类Adapter:持有被适配者类Adaptee的对象,即Adaptee类委派给Adapter类,因此Adaptee类和它的子类都可以适用。实现目标接口Target。持有原有的属性和方法,同时不可直接修改原有方法,还实现了目标接口中新增的方法。而且适配器类只有这些方法可以使用。替换原有类的一些方法比较麻烦,可能需要先写一个Adaptee类的子类,然后将其子类委派给Adapter类。重定义原有方法困难,因为这是关联委派关系。建议尽量使用对象适配器的实现方式,多用合成/聚合、少用继承。当然,具体问题具体分析,根据需要来选用实现方式,最适合的才是最好的。
4、
二、类适配器(继承覆写)
1、被适配者类Adaptee:原有的属性和方法。
2、目标接口Target:新增一些方法。
3、适配器类Adapter:继承被适配者类Adaptee,实现目标接口Target。继承原有的属性和方法,同时也可以修改原有方法,还实现了目标接口中新增的方法。既可以使用和修改原有类的属性和方法,还可以使用目标接口中声明的方法。一个适配器类对应一个被适配者类,因为这是继承关系。
4、
三、接口适配器
四、优点
1、类适配器模式还具有如下优点:
由于适配器类是适配者类的子类,因此可以在适配器类中置换一些适配者的方法,使得适配器的灵活性更强。
2、对象适配器模式还具有如下优点:
一个对象适配器可以把多个不同的适配者适配到同一个目标,也就是说,同一个适配器可以把适配者类和它的子类都适配到目标接口。
五、缺点
1、类适配器模式的缺点如下:
对于Java、C#等不支持多重继承的语言,一次最多只能适配一个适配者类,而且目标抽象类只能为抽象类,不能为具体类,其使用有一定的局限性,不能将一个适配者类和它的子类都适配到目标接口。
2、对象适配器模式的缺点如下:
与类适配器模式相比,要想置换适配者类的方法就不容易。如果一定要置换掉适配者类的一个或多个方法,就只好先做一个适配者类的子类,将适配者类的方法置换掉,然后再把适配者类的子类当做真正的适配者进行适配,实现过程较为复杂。
六、类和对象适配器模式的使用场景
-
灵活使用时:选择对象的适配器模式
类适配器使用对象继承的方式,是静态的定义方式;而对象适配器使用对象组合的方式,是动态组合的方式。 -
需要同时配源类和其子类:选择对象的适配器对于类适配器,由于适配器直接继承了Adaptee,使得适配器不能和Adaptee的子类一起工作,因为继承是静态的关系,当适配器继承了Adaptee后,就不可能再去处理 Adaptee的子类了;对于对象适配器,一个适配器可以把多种不同的源适配到同一个目标。换言之,同一个适配器可以把源类和它的子类都适配到目标接口。因为对象适配器采用的是对象组合的关系,只要对象类型正确,是不是子类都无所谓。
- 需要重新定义Adaptee的部分行为:选择类适配器,对于类适配器,适配器可以重定义Adaptee的部分行为,相当于子类覆盖父类的部分实现方法。对于对象适配器,要重定义Adaptee的行为比较困难,这种情况下,需要定义Adaptee的子类来实现重定义,然后让适配器组合子类。虽然重定义Adaptee的行为比较困难,但是想要增加一些新的行为则方便的很,而且新增加的行为可同时适用于所有的源。
- 仅仅希望使用方便时:选择类适配器,对于类适配器,仅仅引入了一个对象,并不需要额外的引用来间接得到Adaptee。对于对象适配器,需要额外的引用来间接得到Adaptee。
七、适配器模式
1、优点
-
更好的复用性
系统需要使用现有的类,而此类的接口不符合系统的需要。那么通过适配器模式就可以让这些功能得到更好的复用。
-
透明、简单
客户端可以调用同一接口,因而对客户端来说是透明的。这样做更简单 & 更直接
-
更好的扩展性
在实现适配器功能的时候,可以调用自己开发的功能,从而自然地扩展系统的功能。
-
解耦性
将目标类和适配者类解耦,通过引入一个适配器类重用现有的适配者类,而无需修改原有代码
-
符合开放-关闭原则
同一个适配器可以把适配者类和它的子类都适配到目标接口;可以为不同的目标接口实现不同的适配器,而不需要修改待适配类
2、缺点
-
过多的使用适配器,会让系统非常零乱,不易整体进行把握
八、具体讲解。
1、对象适配器。http://www.cnblogs.com/igoodful/p/9377679.html
2、类适配器。http://www.cnblogs.com/igoodful/p/9377610.html
3、接口适配器。http://www.cnblogs.com/igoodful/p/9377775.html