Adapter 模式是一个常用的模式,它可以与其他很多模式共同使用
Adapter模式的意图是 将一个类的接口转换成希望的另外一种接口,Adapter模式使原本由接口不兼容而不能一起工作的那一些类可以起工作,就是说 需要一种方法,为一个内容合适但接口不配的对象创建一个新的接口,这样把一个类的接口转换成客户端所期待的另一个接口,从而使原接口不匹配而无法在一起工作的两个类能在一起工作
意图:将一个无法控制的现有对象与一个特定的接口相匹配
问题:一个系统拥有正确的数据行为,但接口却是错误的,典型用途:必须把某些东西实现为定义或已经拥有的抽象类的派生类
角色:目标(定义一个客户端使用特定接口)、客户(使用目标接口与和目标接口一致的对象合作)、被适配者(一个现存需要匹配的接口)、适配器(负责将接口转换成目标)
解决方案:Adapter模式用需要的接口对无法修改的类进行包装
参与者与协作者:Adapter 对 Adaptee 的接口进行适配,使它与Target(Adapter派生自它)相匹配。让 Client 把 Adaptee 当作 Target 的一个类型来使用它
效果:Adapter 模式让现存的对象适应新的结构,而不受接口的限制
实现:将现存的类包含在另一个类之中。包容类与需要的接口相匹配,并调用被包容类的方法
许多模式都要求某些特定的派生自同一个类,如果已经有现存的类,可以用 Adapter模式将它与适当的抽象类相适配
Adapter模式有两种用类型:
1> 对象 Adapter 模式:使用 Adapter模式叫做对象Adapter模式,因为它依赖于一个对象(适配对象)包含另一个对象(被适配对象)
2> 类 Adapter 模式:实现 Adapter模式的另一种方法是使用多重继承,在这种情况下,它被称为类 Adapter模式
Facade模式 与 Adapter模式的比较
Adapter模式将接口转换成另一个现有的接口
如,示例代码:
public interface XmlReader {
public InputStream xmlReader();
}
public interface ReaderXml {
public InputStream readerXml();
}
public class B implements ReaderXml {
@Override
public InputStream readerXml() {
return null ;
}
}
public class Adapter1 extends B implements XmlReader {
@Override
public InputStream xmlReader() {
return readerXml();
}
}
public class Adapter2 implements XmlReader {
ReaderXml b = new B();
@Override
public InputStream xmlReader() {
return b .readerXml();
}
}