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

适配器模式:系统原来存在的所有接口都不能动。扩展一个新的类,来连接多个之前不同的类。
适配器模式(Adapter)包含以下主要角色。
目标(Target)接口:可以是抽象类或接口。客户希望直接用的接口
public interface Player {String play();}
public interface Translator {String translate(String content);}
适配者(Adaptee)类:隐藏的转换接口
public class MoviePlayer implements Player{@Overridepublic String play() {System.out.println("正在播放视频 你好世界!!!");return "hello";}}
public class zh_Translator implements Translator {@Overridepublic String translate(String content) {if ("hello".equals(content)) {return "你好";} else if ("hello world".equals(content)) {return "你好 世界";} else {return "烫烫烫";}}}
适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口。
继承的方式:类结构实现

public class TranslatorPlayer extends zh_Translator implements Player {//被适配对象private Player target;public TranslatorPlayer(Player target) {this.target = target;}@Overridepublic String play() {String play = target.play();//转换字幕String translate = translate(play);System.out.println("翻译字幕:" + translate);return translate;}}
测试
public static void main(String[] args) {MoviePlayer player = new MoviePlayer();TranslatorPlayer adapter = new TranslatorPlayer(player);adapter.play();}
组合方式:对象结构模式实现

public class TranslatorPlayer implements Player {//被适配对象private Player target;//翻译器private Translator translator = new zh_Translator();public TranslatorPlayer(Player target) {this.target = target;}@Overridepublic String play() {String play = target.play();//转换字幕 组合方式String translate = translator.translate(play);System.out.println("翻译字幕:" + translate);return translate;}}
测试
public static void main(String[] args) {MoviePlayer player = new MoviePlayer();TranslatorPlayer adapter = new TranslatorPlayer(player);adapter.play();}
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为什么存在又取消
