描述

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

类结构型

image.png
image.png
image.png

主要角色

  • 目标(Target)接口:可以是抽象类或接口。客户希望直接用的接口
  • 适配者(Adaptee)类:隐藏的转换接口
  • 适配器(Adapter)类:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口。

代码实现

  1. //目标接口 要适配的接口
  2. public interface MoviePlayback {
  3. String playback();
  4. }
  1. public class AnimationMoviePlayback implements MoviePlayback{
  2. @Override
  3. public String playback() {
  4. String content = "咒术回战 开播!!!";
  5. return content;
  6. }
  7. }
  1. public class MoviePlaybackAdapter /*extends JP_Translation*/ implements MoviePlayback{
  2. //此处翻译器可以 以继承 或者组合方式 组合方式更加灵活
  3. private Translation translation;
  4. private MoviePlayback moviePlayback;
  5. public MoviePlaybackAdapter(MoviePlayback moviePlayback,Translation translation) {
  6. this.moviePlayback = moviePlayback;
  7. this.translation = translation;
  8. }
  9. @Override
  10. public String playback() {
  11. String playback = moviePlayback.playback();
  12. System.out.println(playback+"第二季");
  13. translation.translation();
  14. return null;
  15. }
  16. }
  1. public interface Translation {
  2. void translation();
  3. }
  1. public class ZH_Translation implements Translation{
  2. @Override
  3. public void translation() {
  4. System.out.println("中文翻译");
  5. }
  6. }
  1. public class JP_Translation implements Translation{
  2. @Override
  3. public void translation() {
  4. System.out.println("日文翻译开始");
  5. }
  6. }

测试

  1. public class test {
  2. public static void main(String[] args) {
  3. MoviePlaybackAdapter moviePlaybackAdapter = new MoviePlaybackAdapter(new AnimationMoviePlayback(),new JP_Translation());
  4. moviePlaybackAdapter.playback();
  5. }
  6. }
  7. //输出结果
  8. //咒术回战 开播!!!第二季
  9. //日文翻译开始
  10. public class Adapter {
  11. public static void main(String[] args) {
  12. MoviePlaybackAdapter moviePlaybackAdapter = new MoviePlaybackAdapter(new AnimationMoviePlayback(),new ZH_Translation());
  13. moviePlaybackAdapter.playback();
  14. }
  15. }
  16. //输出结果
  17. //咒术回战 开播!!!第二季
  18. //中文翻译

使用场景

什么场景用到?

  • Tomcat如何将Request流转为标准Request;
    • omcat.Request接口
    • servlet.Request接口
    • tomcat === CoyoteAdapte === ServletRequest Spring
  • AOP中的AdvisorAdapter是什么:增强的适配器
    • 前置、后置、返回、结束 Advisor(通知方法)
    • 底层真的目标方法
  • Spring MVC中经典的HandlerAdapter是什么;
    • HelloController.hello()
    • HandlerAdapter
    • Servlet.doGet()
  • SpringBoot 中 WebMvcConfigurerAdapter为什么存在又取消
  • ……