应用场景:
适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作。
适配器模式的用意是要改变源的接口,以便于目标接口相容。缺省适配的用意稍有不同,它是为了方便建立一个不平庸的适配器类而提供的一种平庸实现。
在任何时候,如果不准备实现一个接口的所有方法时,就可以使用“缺省适配模式”制造一个抽象类,给出所有方法的平庸的具体实现。这样,从这个抽象类再继承下去的子类就不必实现所有的方法了。
其实现方式主要有两种:
1.类的适配器模式(采用继承实现)
2.对象适配器(采用对象组合方式实现)
public interface Target {
public void request();
}
--------------------------------------
//旧的接口, 原来的接口
public class Adaptee {
public void specficRequest(){
System.out.println("将要被我们适配的类,具有特殊功能," +
"\n但是不满足既有的标准接口的类,所以需要适配器模式来适配");
}
}
------------------------------------------------------------------------------------------------------------------------
//没有使用任何适配方式的类,只是实现了标准接口
public class ConcreteTarget implements Target {
@Override
public void request() {
System.out.println("普通类,具有普通功能");
}
}
---------------------------------------
这里开始要适配了,适配有2种方式。任选一种即可。
/**
* 类适配,
* 适配器,实现标准接口,
* 然后继承要陪适配的类,采用继承的方式,就可以调用父类的方法来实现适配目的
* @author Administrator
*
*/
public class Adapter_class extends Adaptee implements Target {
@Override
public void request() {
//继承Adaptee,就可以调用Adaptee的specficRequest
super.specficRequest();
}
}
或--------------------------------------------------------------------------
/**
* 对象适配
* 采用组合的方式来实现目的
* 只需要实现标准接口即可,然后将要适配的对象放在本适配器中
* @author Administrator
*
*/
public class Adapter_object implements Target {
// 直接关联要被适配的类
private Adaptee adaptee;
/**
* 通过构造方法,实例化要被适配的类,实例化了以后。我们就可以用
* 要适配的类的实例对象来调用其中的方法,完成适配的目的
* @param adaptee
*/
public Adapter_object(Adaptee adaptee) {
super();
this.adaptee = adaptee;
}
@Override
public void request() {
adaptee.specficRequest();
}
}
------------------------------------------------------------------
下面是对应适配方式的测试方法
public class Test1 {
/**
* 类适配测试
*/
public static void main(String[] args) {
ConcreteTarget target = new ConcreteTarget();
System.out.println("适配前");
target.request();
System.out.println("类适配后");
Adapter_class adapter_class = new Adapter_class();
adapter_class.request();
}
}
或------------------------------------------------------------------------------------
public abstract class Test2 {
/**
* 对象适配测试类
*/
public static void main(String[] args) {
ConcreteTarget target = new ConcreteTarget();
System.out.println("适配前");
target.request();
System.out.println("对象适配后");
Adapter_object adapter_object = new Adapter_object(new Adaptee());
adapter_object.request();
}
}