适配器模式
解释
适配器,比如电源适配器。让原本不能用的东西,转换一下,使得他可以适配新的东西;
也就是说比如两个接口不适配的时候,B系统只能通过B接口去调用,A系统只能使用A接口,开发一个适配器,外壳还是A接口,但是内核是由B接口实现的,使得A系统能够调用B系统的内容。
在适配器的两端,一边还是2孔,另外一边是3孔
适配器的实现方式
一般有两种实现方式:类适配器,对象适配器
类适配器 UML类图
代码
定义客户端
client不是实现,而是依赖Target接口,也就是说,client只能使用Target接口以及他的子类。
出现另外一套接口标准,client也需要调用
但是另外一套接口标准明显不符合Target接口标准时时,引入 适配器。
package adapter;
public class Client {
//客户端只能调用Target接口的子类
public static void charge(Target target){
target.request();
}
public static void main(String[] args) {
//使用原生的进行充电
charge(new ConcreteTarget());
//现在有另外一个标准的充电方式,但是不满足Target标准,但是客户端又需要调用怎么办?
//charge(new Adapee());
//适配器就是通过适配器,可以实际调用任何东西
charge(new Adapter());//将我的标准告诉适配器,适配器去完成转换,适配,并且返回,不需要修改任何类,增加一个适配器即可
}
}
定义客户端使用的接口标准
package adapter;
public interface Target {
void request();
}
定义客户端原本使用的实现类
但现在不能使用了
package adapter;
//Target接口的一个实现类
public class ConcreteTarget implements Target{
@Override
public void request() {
System.out.println("使用原生的两口插座进行充电");
}
}
定义另外一个接口标准的实现
package adapter;
public class Adapee {
public void anotherRequest(){
System.out.println("另外一套系统的充电标准,使用三口充电");
}
}
通过适配器解决协调
package adapter;
/**
* 定义一个转换器
* 一边满足两口
* 另外一边又可以调用三口
* 基于继承,把三口那边的东西全部拿过来
* 其实你想, 使用一个指针指向一个三口对象好像也可以
*/
public class Adapter extends Adapee implements Target{
@Override
public void request() {
//直接掉三口的方法进行返回,同时对返回的数据进行转换,类似于电压的转换
super.anotherRequest();
System.out.println("通过适配器,实际调用三口插座");
}
}
类适配器UML
你看,是吧,通过只有对象类进行调用
上面的例子提到,适配器通过继承待适配的类,把待适配的类的成员全部拿过来。但其实通过持有一个待适配的对象也可以实现功能,不通过继承。
实现方式与类适配器实现方式大致相同,只不过将 Adapter 从 Adaptee 类继承 改为 Adapter 持有 Adaptee 类对象。
修改适配器
package adapter;
/**
* 定义一个转换器
* 一边满足两口
* 另外一边又可以调用三口
* 基于继承,把三口那边的东西全部拿过来
* 其实你想, 使用一个指针指向一个三口对象好像也可以
*/
public class Adapter implements Target{
Adapee adapee;
public Adapter(Adapee adapee) {
this.adapee = adapee;
}
@Override
public void request() {
//直接掉三口的方法进行返回,同时对返回的数据进行转换,类似于电压的转换
adapee.anotherRequest();
System.out.println("通过适配器,实际调用三口插座");
}
}
总结
适配器模式适合于系统整合,扩展,接口调试
== 适配器嘛,只要适配器开发得好,大部分系统都可以整合。==