1. 适配器模式(Adapter Pattern)
Adapter is a structural design pattern that allows objects with incompatible interfaces to collaborate.
- Also known as: Wrapper
- 适配器用来做适配,将不兼容的接口转换为可兼容的接口,让原本由于接口不兼容而不能一起工作的类可以一起工作
1.1 日常生活场景
- 家用电器是交流电,而计算机工作电源是直流电,电源适配器(AC Adapter)将交流电转换为直流电
- 注意:一个适配器只能适配一个被适配对象类型,因为适配器与被适配对象类型之间的耦合是静态关联关系(对象引用或继承)
1.2 组成部分
- Target:目标接口
- Adaptee:被适配者
- Adapter:适配器,将 Adaptee 转换为 Target
2. 两种实现方式
2.1 类适配器
- 类适配器通过继承适配者类(Adaptee)实现的
![](https://img.haomeiwen.com/i20154612/cb2792e1219d8791.png)
public interface Target {
String service(String param);
}
public class Adaptee {
public String execute(String param) {
return "Adaptee@" + param;
}
}
public class Adapter extends Adaptee implements Target {
@Override
public String service(String param) {
String execute = super.execute(param);
// do something
return "do something: " + execute;
}
}
测试代码:
@Test
public void test() {
Target target = new Adapter();
String test = target.service("test");
System.out.println(test);
}
2.2 对象适配器
- 对象适配器使用组合关系来实现,包含一个适配器者(Adaptee)的引用
![](https://img.haomeiwen.com/i20154612/804216486428596c.png)
public class Adapter implements Target {
private Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
@Override
public String service(String param) {
String execute = adaptee.execute(param);
// do something
return "do something: " + execute;
}
}
测试代码:
@Test
public void test() {
Target target = new Adapter(new Adaptee());
String test = target.service("test");
System.out.println(test);
}
3. 应用
3.1 Spring MVC中的HandlerAdapter适配器
![](https://img.haomeiwen.com/i20154612/2b3ef3aad83d8ab0.png)
public class DispatcherServlet extends FrameworkServlet {
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
// ...
ModelAndView mv = null;
mappedHandler = getHandler(processedRequest);
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
// ...
}
protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
// ...
}
}
网友评论