适配器模式:将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
使用背景:
美国电器 110V,中国 220V,就要有一个适配器将 110V 转化为 220V,换个例子来说,就是你去到国外,但是你不会讲那一国的语言,而你想沟通的那个人,不会说中国话,这时候你需要一个会两国语言的人,就可以解决相互沟通的这个问题。在软件开发的过程中,如果希望复用某些系统现存的类去完成某种需求,但是接口与复用环境要求不一致的时候,这时候我们可以使用适配器模式将控制范围之外的某些原有对象与某个接口匹配,以求达到某种需求。
适配器模式的基本组成:
Target
客户所期待的接口,可以具体或者抽象的类,也可以是接口。
Adapter
通过在内部包装一个Adaptee对象,把源接口转换成目标接口。
Adaptee
需要适配的类。
具体实现如下:
Target类
package adapter;
/**
* Created by canon on 2018/12/5.
*/
public interface Target {
void request();
}
Adaptee类
package adapter;
/**
* Created by canon on 2018/12/5.
*/
public class Adaptee {
public void specialRequest(){
System.out.println("特殊请求");
}
}
Adapter类
package adapter;
/**
* Created by canon on 2018/12/5.
*/
public class Adapter implements Target {
private Adaptee adaptee = new Adaptee();
@Override
public void request() {
adaptee.specialRequest();
}
}
客户端
package adapter;
/**
* Created by canon on 2018/12/5.
*/
public class controller {
public static void main(String[] args) {
Target target = new Adapter();
target.request();
}
}
----------------------------客户端输出--------------------------------
特殊请求
Process finished with exit code 0
以上是适配器模式的对象适配器的基本用法。不管是类适配器模式还是对象适配器模式。都将目标类和适配者类解耦,通过引入一个适配器类来重用现有的适配者类,无需修改原有结构。增加了类的透明性和复用性,将具体的业务实现过程封装在适配者类中,对于客户端类而言是透明的,而且提高了适配者的复用性,同一适配者类可以在多个不同的系统中复用。灵活性和扩展性都非常好,通过使用配置文件,可以很方便的更换适配器,增加新的适配器,完全复合开闭原则。
缺点:
过多的使用适配器,会让系统非常零乱,不易整体进行把握。比如,明明看到调用的是A接口,其实内部被适配成了B接口的实现,一个系统如果太多出现这种情况,无异于一场灾难。模式虽好,系统设计之初,出现接口不同时,首先考虑的不是适配器模式,而应该是考虑通过重构统一接口解决问题。