原创文章,转载请务必将下面这段话置于文章开头处(保留超链接)。
本文转发自技术世界,原文链接 http://www.jasongj.com/design_pattern/adapter/
适配器模式介绍
适配器模式定义
适配器模式(Adapter Pattern),将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
适配器模式类图
适配器模式类图如下
适配器模式角色划分
目标接口,如上图中的ITarget
具体目标实现,如ConcreteTarget
适配器,Adapter
待适配类,Adaptee
实例解析
本文代码可从作者Github下载
目标接口1
2
3
4
5
6
7package com.jasongj.target;
public interface ITarget {
void request();
}
目标接口实现1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16package com.jasongj.target;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class ConcreteTarget implements ITarget {
private static Logger LOG = LoggerFactory.getLogger(ConcreteTarget.class);
public void request() {
LOG.info("ConcreteTarget.request()");
}
}
待适配类,其接口名为onRequest,而非目标接口request1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16package com.jasongj.adaptee;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.jasongj.target.ConcreteTarget;
public class Adaptee {
private static Logger LOGGER = LoggerFactory.getLogger(ConcreteTarget.class);
public void onRequest() {
LOGGER.info("Adaptee.onRequest()");
}
}
适配器类1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20package com.jasongj.target;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.jasongj.adaptee.Adaptee;
public class Adapter implements ITarget {
private static Logger LOG = LoggerFactory.getLogger(Adapter.class);
private Adaptee adaptee = new Adaptee();
public void request() {
LOG.info("Adapter.request");
adaptee.onRequest();
}
}
从上面代码可看出,适配器类实际上是目标接口的类,因为持有待适配类的实例,所以可以在适配器类的目标接口被调用时,调用待适配对象的接口,而客户端并不需要知道二者接口的不同。通过这种方式,客户端可以使用统一的接口使用不同接口的类。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.jasongj.client;
import com.jasongj.target.Adapter;
import com.jasongj.target.ConcreteTarget;
import com.jasongj.target.ITarget;
public class AdapterClient {
public static void main(String[] args) {
ITarget adapter = new Adapter();
adapter.request();
ITarget target = new ConcreteTarget();
target.request();
}
}