顾名思义,适配器---我们在生活中都有用到过,比如我们经常用的笔记本的电源,就是个变压器,其实就是适配器,他的作用非常简单明了,就是把220V的电压转成笔记本可以用的电压。这里220v的电压就是被适配者,笔记本电压就是目标电压,而变压器就充当着适配器的身份。
再举个例子,一个人他会两种外语,英语和法语,突然有一天上级要让他去德国工作,但是他不会德语,怎么办呢,参加语言培训班呗,由于他会说话,同时也有脑子,培训班很轻易就让他学会了德语,这样他到德国后可以直接开始用德语交谈,没有影响工作。这里边,培训班就充当着适配器的角色,培训班把一个本来只会英语和法语的人,适配成了一个会英语法语德语的人。简单来讲,适配器模式的作用就是让原来的东西能够适应新的环境。
下边举个实际的例子,某公司的日志系统,原来是存储在文件中的,这个实现类如下:
public class LogModel {
private String logId;
private String operateUser;
private String operateTime;
private String logContent;
//下边是各种get,set方法
}
public class LogFileOperate implements LogFileOperateApi {
private String logFilePathName = "AdapterLog.log";
public LogFileOperate(String logFileName) {
if(logFilePathName!=null && logFilePathName.trim().length>0) {
this.logFilePathName = logFilePathName;
}
}
public List<LogModel> readLogFile() {
List<LogModel> list = null;
ObjectInputStream oin = null;
File f = new File(logFilePathName);
if(f.exists()) {
oin = new ObjectInputStream(new BufferedInputSteam(new FileInputStream(f)));
list = (List<LogModel>)oin.readObject();
}
return list;
}
public void writeLogFile(List<LogModel> list) {
File f = new File(logFilePathName);
ObjectOutputStream oout = null;
oout = new ObjectOutputStream(new BufferedOutputStream(new FileOutputStream(f)));
oout.writeObject(list);
oout.close();
}
}
这是原来的日志实现代码,他只有两个功能,一个是写,一个是读。
而现在由于系统升级,想要用数据库来实现日志的存储,并且实现增删查改的功能,新的实现类LogDbOperate就不写了,有增删查改四个功能。
但是又不能把原来的系统给扔掉,因为里边还有很多有用的日志文件,当然我们可以把那些日志重新弄到数据库中,但是我们能重用就重用,而不是选择从新来。
我们选择通过一个适配器把原来的日志文件系统适配到现有的数据库增删查改系统上,这里适配器模式的目的就非常明确,就是让旧的系统也实现增删查改的功能。目前旧的系统只有读和写两个功能,即增和查,这里适配器的功能就是让旧的系统实现其他两个功能,即删和改。
为了容易理解,我们假设我们拿不到旧系统的代码,即我们只能在旧系统现有的基础上进行改动以适配新系统。
下面先给出适配器模式的整体构成图:
用户----------系统接口(新的系统接口)------------适配器-----------被适配者(旧的系统)
其中新的系统接口叫做Target,目标;适配器叫做Adapter,被适配者叫做Adaptee;就是用适配器把旧系统适配到目标系统
下面是适配器模式的示例代码:
// 客户端使用的接口
public inter face Target {
public void request();
}
public class Adaptee {
public void specificRequest() {
// 具体功能
}
}
public class Adapter implements Target {
private Adapter adapter;
public Adapter(Adapter adapter) {
this.adaptee = adaptee;
}
public void request() {
adaptee.specificRequest();
}
}
public class Client {
public static void main(String[] args) {
Adaptee adaptee = new Adaptee();
Target target = new Adapter(adaptee);
target.request();
}
}
不难看出,表面上客户端调用了request方法,其实真正调用的是sprecificRequest这个方法,这就是适配器的原理