欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

适配器模式详解:让各类组件轻松协同工作的设计秘诀

最编程 2024-07-31 11:50:54
...

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

}