一、概述
适配器模式(Adapter),将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
● 目标(Target)角色:这就是所期待得到的接口。注意:由于这里讨论的是类适配器模式,因此目标不可以是类。
● 源(Adapee)角色:现在需要适配的接口。
● 适配器(Adaper)角色:适配器类是本模式的核心。适配器把源接口转换成目标接口。显然,这一角色不可以是接口,而必须是具体类。
适配器模式分为两类:
1)对象适配器模式(采用组合方式)
在这种适配器模式中,适配器容纳一个它包裹的类的实例。在这种情况下,适配器调用被包裹对象的物理实体。
2)类适配器模式(继承方式)
这种适配器模式下,适配器继承自已实现的类(一般多重继承)。
结构图:
对象适配器例子:
国内使用的是两脚插头和三角斜脚插头,而香港使用的是三脚垂直插头。当我们去香港游玩的时候,住宿酒店使用的是香港标准的插座,这样大陆标准的插头在香港就不能给手机充电了。为了解决充电问题,就有了插头转换器,而这个插头转换器就类似我们设计模式中的适配器类。
被适配的对象(源对象):
/*
* 大陆标准插头
*/
public class MainlandSocketAdaptee {
/*
* 充电方法
*/
public void mainlandCharge(){
//业务代码
}
}
/*
* 香港标准插头
*/
public interface HongKongSocketTarget {
/*
* 充电方法
*/
public void hongKongCharge();
}
适配器:
/*
* 适配器类
*/
public class SocketAdapter implements HongKongSocketTarget{
/*
* 持有需要被适配的接口对象
*/
private MainlandSocketAdaptee adaptee;
/*
* 构造方法,传入需要被适配的对象
* @param adaptee 需要被适配的对象
*/
public SocketAdapter(MainlandSocketAdaptee adaptee){
this.adaptee = adaptee;
}
@Override
public void hongKongCharge() {
adaptee.mainlandCharge();
}
}
客户端代码
/*
* 使用适配器的客户端
*/
public class Client {
public static void main(String[] args){
//创建需要被适配的对象
MainlandSocketAdaptee adaptee = new MainlandSocketAdaptee();
//创建客户端需要调用的接口对象
HongKongSocketTarget target = new SocketAdapter(adaptee);
target.hongKongCharge();
}
}
应用场景:
1)旧的系统开发的类已经实现了一些功能,但是客户端却只能以另外接口的形式访问,但我们不希望手动更改原有类的时候。
2)使用第三方组件,组件接口定义和自己定义的不同,不希望修改自己的接口,但是要使用第三方组件接口的功能。
3)创建一个可以复用的类,使得该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作;
参考:https://www.ibm.com/developerworks/cn/java/j-lo-adapter-pattern/
参考:http://blog.csdn.net/zhangjg_blog/article/details/18735243