1. 适配器模式(Adapter Pattern)

  • 将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,适配器模式分为类结构型模式(继承)和对象结构型模式(组合)两种,前者(继承)类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结构,所以应用相对较少些。

  • 别名也可以是Wrapper,包装器

08. 适配器模式(Adapter Pattern) - 图1

适配器模式:系统原来存在的所有接口都不能动。扩展一个新的类,来连接多个之前不同的类。

适配器模式(Adapter)包含以下主要角色。

目标(Target)接口:可以是抽象类或接口。客户希望直接用的接口

  1. public interface Player {
  2. String play();
  3. }
  1. public interface Translator {
  2. String translate(String content);
  3. }

适配者(Adaptee)类:隐藏的转换接口

  1. public class MoviePlayer implements Player{
  2. @Override
  3. public String play() {
  4. System.out.println("正在播放视频 你好世界!!!");
  5. return "hello";
  6. }
  7. }
  1. public class zh_Translator implements Translator {
  2. @Override
  3. public String translate(String content) {
  4. if ("hello".equals(content)) {
  5. return "你好";
  6. } else if ("hello world".equals(content)) {
  7. return "你好 世界";
  8. } else {
  9. return "烫烫烫";
  10. }
  11. }
  12. }

适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口。

继承的方式:类结构实现

08. 适配器模式(Adapter Pattern) - 图2

  1. public class TranslatorPlayer extends zh_Translator implements Player {
  2. //被适配对象
  3. private Player target;
  4. public TranslatorPlayer(Player target) {
  5. this.target = target;
  6. }
  7. @Override
  8. public String play() {
  9. String play = target.play();
  10. //转换字幕
  11. String translate = translate(play);
  12. System.out.println("翻译字幕:" + translate);
  13. return translate;
  14. }
  15. }

测试

  1. public static void main(String[] args) {
  2. MoviePlayer player = new MoviePlayer();
  3. TranslatorPlayer adapter = new TranslatorPlayer(player);
  4. adapter.play();
  5. }

组合方式:对象结构模式实现

08. 适配器模式(Adapter Pattern) - 图3

  1. public class TranslatorPlayer implements Player {
  2. //被适配对象
  3. private Player target;
  4. //翻译器
  5. private Translator translator = new zh_Translator();
  6. public TranslatorPlayer(Player target) {
  7. this.target = target;
  8. }
  9. @Override
  10. public String play() {
  11. String play = target.play();
  12. //转换字幕 组合方式
  13. String translate = translator.translate(play);
  14. System.out.println("翻译字幕:" + translate);
  15. return translate;
  16. }
  17. }

测试

  1. public static void main(String[] args) {
  2. MoviePlayer player = new MoviePlayer();
  3. TranslatorPlayer adapter = new TranslatorPlayer(player);
  4. adapter.play();
  5. }

2. 应用场景

  • Tomcat如何将Request流转为标准Request;

    • tomcat.Request接口
    • servlet.Request接口
    • tomcat === CoyoteAdapte === ServletRequest
  • Spring AOP中的AdvisorAdapter是什么:增强的适配器

    • 前置、后置、返回、结束 Advisor(通知方法)
    • 底层真的目标方法
  • Spring MVC中经典的HandlerAdapter是什么;

    • HelloController.hello()
    • HandlerAdapter
    • Servlet.doGet()
  • SpringBoot 中 WebMvcConfigurerAdapter为什么存在又取消