1.什么是适配器模式
适配器模式是一种结构型设计模式,它通过一个适配器,使两个互不兼容的对象能够在一起工作,例如讲中文的人同将英文的人对话时需要一个翻译。
2.适配器模式角色组成
- 适配器
- 适配者
- 客户端
- 目标接口
3.模式的结构与实现
类适配器模式可采用多重继承方式实现,如 C++ 可定义一个适配器类来同时继承当前系统的业务接口和现有组件库中已经存在的组件接口;java不支持多继承,但可以定义一个适配器来实现当前系统的业务接口,同时又继承现有组件库中已经存在的组件。
包含的主要角色
- 目标(Target)接口:当前系统业务所期待、需要的接口,它可以是抽象类或接口
- 适配者(Adaptee)类:
- 适配器(Adapter)类:它是一个转换器,通过继承适配者类、实现目标接口类,使适配者接口与目标接口兼容
适配器模式结构有两种:
(1)类适配器模式结构
模式实现:
//目标接口
interface Target{
public void request();
}
//适配者
class Adaptee{
public void specificRequest(){
System.out.println("适配者中的业务代码正在被调用");
}
}
//适配器
class Adapter extend Adaptee implments Target{
//实现接口方法,在接口中调用适配者的行为,实现接口的兼容
public void request(){
specificRequest();
}
}
//客户端
public ClassAdapter Test{
public static void main(string[] args){
Target target = new Adapter();
target.request();
}
}
(2)对象适配器结构
对象适配器不需要继承适配者,而是在适配器中存放适配者类型的成员变量,通过成员变量调用适配者的行为
//目标接口
interface Target{
public void request();
}
//适配者
class Adaptee{
public void specificRequest(){
System.out.println("适配者中的业务代码正在被调用");
}
}
//适配器
class Adapter implments Target{
Adaptee adaptee;
public Target(Adaptee adaptee){
this.adaptee = adaptee;
}
public void request(){
adaptee.specificRequest();
}
}
//客户端
public ClassAdapter Test{
public static void main(string[] args){
Adaptee adaptee = new adaptee();
Target target = new Adapter(adaptee);
target.request();
}
}
实际上,两种不同的结构本质上是两个不同的类交互的两种方式,一个是通过继承,一个则是通过组合。
4.适配器模式的优点和缺点
适配器模式的优点和缺点显而易见
假设还是有Adaptee和Target两个对象,这两个对象互补兼容,如果不使用适配器模式如何使两个对象一起工作呢?
class Target{
public void request();
}
class Adaptee{
public void specificRequest(){
System.out.println("适配者中的业务代码正在被调用");
}
}
很简单也是通过继承或组合,但是这样就会修改代码
class Target{
public void request();
}
class Adaptee{
Target target;
public Adaptee(Target target){
this.target = target;
}
public void specificRequest(){
System.out.println("适配者中的业务代码正在被调用");
target.request();
}
}
//客户端
public ClassAdapter Test{
public static void main(string[] args){
Target target = new Target();
Adaptee adaptee = new adaptee(target);
}
}
而适配器模式是不需要修改源代码,直接可以对代码进行复用,所以适配者模式的优点和缺点如下:
(1)优点
- 客户端通过适配器可以透明地调用目标接口。
- 复用了现存的类,程序员不需要修改原有代码而重用现有的适配者类。
- 将目标类和适配者类解耦,解决了目标类和适配者类接口不一致的问题。
- 在很多业务场景中符合开闭原则(对扩展开放,对修改关闭)。
(2)缺点
- 适配器编写过程需要结合业务场景全面考虑,可能会增加系统的复杂性。
- 增加代码阅读难度,降低代码可读性,过多使用适配器会使系统代码变得凌乱。