1、适配器模式简介
著名的设计模式“四人帮”这样评价适配器模式:
将一个类的接口转换成客户希望的另外一个接口。Adapter 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。——Gang of Four
适配器模式将一个类的接口适配成用户所期待的。一个适配器通常允许因为接口不兼容而不能一起工作的类能够在一起工作,做法是将类自己的接口包裹在一个已存在的类中。
Adapter 设计模式主要目的组合两个不相干类,常用有两种方法,第一种解决方案是修改各自类的接口。但是如果没有源码,或者不愿意为了一个应用而修改各自的接口,则需要使用 Adapter 适配器,在两种接口之间创建一个混合接口。
Adapter 适配器设计模式中有 3 个重要角色:
- 被适配者 Adaptee,
- 适配器 Adapter 和目标对象 Target。
- 其中两个现存的想要组合到一起的类分别是被适配者 Adaptee 和目标对象 Target 角色
2、代码实现
1)常规适配器
清单1:客户端使用的接口
/*
* 定义客户端使用的接口,与业务相关
*/
public interface Target {
/*
* 客户端请求处理的方法
*/
public void request();
}
清单2:被适配的对象
/*
* 已经存在的接口,这个接口需要配置
*/
public class Adaptee {
/*
* 原本存在的方法
*/
public void specificRequest(){
//业务代码
}
}
清单2:适配器的实现
/*
* 适配器类
*/
public class Adapter implements Target{
/*
* 持有需要被适配的接口对象
*/
private Adaptee adaptee;
/*
* 构造方法,传入需要被适配的对象
* @param adaptee 需要被适配的对象
*/
public Adapter(Adaptee adaptee){
this.adaptee = adaptee;
}
@Override
public void request() {
// TODO Auto-generated method stub
adaptee.specificRequest();
}
}
清单4:客户端实现
/*
* 使用适配器的客户端
*/
public class Client {
public static void main(String[] args){
//创建需要被适配的对象
Adaptee adaptee = new Adaptee();
//创建客户端需要调用的接口对象
Target target = new Adapter(adaptee);
//请求处理
target.request();
}
}
2)双向适配器
适配器也可以实现双向的适配,前面所讲的都是把 Adaptee 适配成为 Target,其实也可以把 Target 适配成为 Adaptee。也就是说这个适配器可以同时当作 Target 和 Adaptee 来使用。
import java.util.List;
/*
* 双向适配器对象案例
*/
public class TwiceAdapter implements LogDbOpeApi,LogFileOperateApi {
/*
* 持有需要被适配的文件存储日志的接口对象
*/
private LogFileOperateApi fileLog;
/*
* 持有需要被适配的 DB 存储日志的接口对象
*/
private LogDbOpeApi dbLog;
public TwiceAdapter(LogFileOperateApi fileLog,LogDbOpeApi dbLog){
this.fileLog = fileLog;
this.dbLog = dbLog;
}
@Override
public List<LogBean> readLogFile() {
// TODO Auto-generated method stub
return null;
}
@Override
public void writeLogFile(List<LogBean> list) {
// TODO Auto-generated method stub
}
@Override
public void createLog(LogBean logbean) {
// TODO Auto-generated method stub
List<LogBean> list = fileLog.readLogFile();
list.add(logbean);
fileLog.writeLogFile(list);
}
}
双向适配器同时实现了 Target 和 Adaptee 的接口,使得双向适配器可以在 Target 或 Adaptee 被使用的地方使用,以提供对所有客户的透明性。尤其在两个不同的客户需要用不同的地方查看同一个对象时,适合使用双向适配器。
3、适配器模式应用场景
在软件开发中,也就是系统的数据和行为都正确,但接口不相符时,我们应该考虑用适配器,目的是使控制范围之外的一个原有对象与某个接口匹配。适配器模式主要应用于希望复用一些现存的类,但是接口又与复用环境要求不一致的情况。比如在需要对早期代码复用一些功能等应用上很有实际价值。适用场景大致包含三类:
1、已经存在的类的接口不符合我们的需求;
2、创建一个可以复用的类,使得该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作;
3、在不对每一个都进行子类化以匹配它们的接口的情况下,使用一些已经存在的子类。