设计模式之适配器模式

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)实现的
image.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)的引用
image.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适配器

HandlerAdapter
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 {
    // ...
  }

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容