本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/51570748
1、定义
适配器模式将一个类的接口,转换成客户期望的另一个接口。适配器让原本不兼容的类可以合作无间。(摘自Head First中文版243页)
2、说明
通常情况下的适配器模式有两种形式:对象适配器和类适配器。类的适配器模式采用继承实现,而对象适配器采用对象组合方式实现。
类适配器使用继承的方式(静态方式),这样就使得适配器不能和Adaptee的子类一起工作。当目标类数量随着业务需求变得越来越多时,会使得代码结构变得复杂,以至于难以维护;对象适配器使用对象组合的方式(动态组合方式),一个适配器可以把多种不同的源适配到同一个目标,即同一个适配器可以把源类和源类的子类都适配到目标接口。所以在实际情况下,建议尽量多使用对象适配器的实现方式,即多用组合、少用继承。但是对于具体的问题,还是需要选择合适的方式去实现。
那什么时候使用适配器模式呢?一种情况是,你想使用一个已经存在的类,而其接口不符合你的需求。你打算创建一个可以复用的类,该类可以与其它不相关的类或不可预见的类(即接口间不兼容的类)协同工作,则可以考虑使用适配器模式。另一种情况是,你想使用一些已经存在的类,但是不可能对每一个类都子类化以匹配它们的接口,这时可以考虑使用(对象)适配器模式(对象适配器可以适配它的父类接口)。
3、角色
目标接口(Target):客户所期待的接口,具体类、抽象类、接口。
待适配的类(Adaptee):需要适配的类。
适配器(Adapter):包装一个需要适配的对象,把原接口转换成目标接口。
4、类图
5、示例
类适配器示例如下所示:
package headfirst.design.adapter.extend;
/**
* 已存在的、具有特殊功能、但不符合我们既有的标准接口的类
*/
public class Adaptee {
public void specialMethod() {
System.err.println("这是一个经过适配的特殊的方法");
}
}
package headfirst.design.adapter.extend;
/**
* 定义客户端期待的接口
*/
public interface Itarget