一.适配器模式定义
把一个类的接口转换成客户端期待的另一种接口,从而使原接口不匹配而无法再一起工作的两个类能在一起工作。
二.适配器模式中的角色
目标、客户、被适配者、适配器是适配器模式中的四个角色。
目标(CTarget):定义客户端使用的特定接口;
客户(CClient):使用目标接口,与目标接口一致的对象合作;
被适配者(CAdaptee):一个现存需要匹配的接口;
适配器(Adapter):负责将CAdaptee接口转换成CTarget接口。
三.适配器模式实现方式
适配器模式的实现方式可以分为两种类适配器和对象适配器。
类适配器是通过继承类适配者类(CAdaptee)实现的,另外类适配器类还需要实现客户类所需的接口。当客户对象(CClient)调用适配器类(Adapter)的方法时,适配器内部调用它所继承的适配者的方法。
对象适配器包含一个适配者的引用(reference),与类适配器类相同,对象适配类也实现了客户类所需的接口。当客户类对象调用适配器对象的方法时,适配器对象调用的是它包含的适配者实例的方法。
四.适配器代码演示
下面通过几段代码来加深对适配器模式的理解。
适配者(CAdaptee)
package cn.lzz.design.adapterM;
public class Adaptee {
public void specialRequest(){
System.out.println("Called specialRequest() in Adaptee");
}
}
目标(CTarget)
package cn.lzz.design.adapterM;
public interface Target {
public void request();
}
对象适配器(Adapter)
package cn.lzz.design.adapterM;
public class AdapterI implements Target{
private static Adaptee adaptee;
static{
adaptee=new Adaptee();
}
@Override
public void request() {
// TODO Auto-generated method stub
adaptee.specialRequest();
}
}
类适配器(CTarget)
package cn.lzz.design.adapterM;
public class AdapterC extends Adaptee implements Target{
@Override
public void request() {
// TODO Auto-generated method stub
this.specialRequest();
}
}
客户(CClient)
package cn.lzz.design.adapterM;
public class Client {
public static void main(String[] args) {
Target target=new AdapterI();
target.request();
}
}
通过上文的代码我可以看下,适配器模式的核心是适配器,适配器不仅需要实现目标(CTarget)的接口,还需通过继承或者组合的方式获取适配者,在目标类的实现方法中完成适配工作。适配器让两个不匹配的接口可以匹配使用。
这是本人的第一篇博客,感觉开始的时间还是有点晚了。但又感觉只要开始了就不晚。设计模式给我打开了一扇窗,让自己在写代码的时候,可以试着用面向对象的特性封装、继承、多态设计和编写代码,让代码变的更简洁、扩展性和复用性更好,减少代码量少加点班。记得有个老员工和我说过,很少有知识点可以学一遍就能学好,一般都需要在实践中不停的去用去实践,才能正在的学会学懂。