适配器模式是一种结构型设计模式,适配器用于抽象出一个中间层做转换工作,使得两个原本不相关或不兼容的接口共同工作,主要用于兼容目前已存在的接口。
假设我们已经有一个搜索引擎类SearchEngine,它接收一个Request作为参数,Request有一个方法getEnglishBody,用于返回英文内容作为搜索关键字,定义如下。
public interface Request {
String getEnglishBody();
}
但是我们目前业务拿到的数据Query是中文的,其定义如下。
public interface Query {
String getChineseBody();
}
在不考虑设计模式的情况下,我们会写一个方法将Query中的中文数据转化为英文数据,然后再构造一个Request对象传递给SearchEngine,这样没有问题,但是不够面向对象,下面看看更加面向对象的方式来对接两个不兼容接口,也就是适配器模式。
适配器模式有两种实现方式,对象适配器和类适配器,两者实现方式有一些差别,类适配器是通过实现或继承的方式持有被适配的对象,而对象适配器则是通过组合的方式持有被适配的对象。
1public class RequestAdapter implements Request {
2
3 private final Query query;
4
5 public RequestAdapter(Query query) {
6 this.query = query;
7 }
8
9 @Override
10 public String getEnglishBody() {
11 return translate2English(query.getChineseBody());
12 }
13}
public class RequestAdapter implements Request, Query {
@Override
public String getEnglishBody() {
return translate2English(getChineseBody());
}
...
}
无论何种实现方式,RequestAdapter都可以作为参数传入SearchEngine了。
适配器模式优点就是可以兼容两个不同的接口,提到代码的扩展性和复用性,比如说某功能已经有一个比较好的实现,但是它的入参和我们目前应用的数据不一致,我们可以写一个适配器将目前的数据转化为其要求的数据,从而达到复用的目的。