Chiriri's blog Chiriri's blog
首页
  • Java

    • JavaSE
    • JavaEE
    • 设计模式
  • Python

    • Python
    • Python模块
    • 机器学习
  • Golang

    • Golang
    • gRPC
  • 服务器

    • Linux
    • MySQL
    • NoSQL
    • Kubernetes
  • 项目

    • 传智健康
    • 畅购商城
  • Hadoop生态

    • Hadoop
    • Zookeeper
    • Hive
    • Flume
    • Kafka
    • Azkaban
    • Hbase
    • Scala
    • Spark
    • Flink
  • 大数据项目

    • 离线数仓
  • 青训营

    • 第四届青训营
  • HTML

    • HTML
    • JavaScript
  • Vue

    • Vue2
    • TypeScript
    • Vue3
    • Uni-APP
  • 数据结构与算法
  • C语言
  • 考研数据结构
  • 计算机组成原理
  • 计算机操作系统
  • Java基础

    • Java基础
    • Java集合
    • JUC
    • JVM
  • 框架

    • Spring
    • Dubbo
    • Spring Cloud
  • 数据库

    • MySQL
    • Redis
    • Elasticesearch
  • 消息队列

    • RabbitMQ
    • RocketMQ
  • 408

    • 计算机网络
    • 操作系统
    • 算法
  • 分类
  • 标签
  • 归档
  • 导航站
GitHub (opens new window)

Iekr

苦逼后端开发
首页
  • Java

    • JavaSE
    • JavaEE
    • 设计模式
  • Python

    • Python
    • Python模块
    • 机器学习
  • Golang

    • Golang
    • gRPC
  • 服务器

    • Linux
    • MySQL
    • NoSQL
    • Kubernetes
  • 项目

    • 传智健康
    • 畅购商城
  • Hadoop生态

    • Hadoop
    • Zookeeper
    • Hive
    • Flume
    • Kafka
    • Azkaban
    • Hbase
    • Scala
    • Spark
    • Flink
  • 大数据项目

    • 离线数仓
  • 青训营

    • 第四届青训营
  • HTML

    • HTML
    • JavaScript
  • Vue

    • Vue2
    • TypeScript
    • Vue3
    • Uni-APP
  • 数据结构与算法
  • C语言
  • 考研数据结构
  • 计算机组成原理
  • 计算机操作系统
  • Java基础

    • Java基础
    • Java集合
    • JUC
    • JVM
  • 框架

    • Spring
    • Dubbo
    • Spring Cloud
  • 数据库

    • MySQL
    • Redis
    • Elasticesearch
  • 消息队列

    • RabbitMQ
    • RocketMQ
  • 408

    • 计算机网络
    • 操作系统
    • 算法
  • 分类
  • 标签
  • 归档
  • 导航站
GitHub (opens new window)
  • JavaSE

  • JavaEE

  • Linux

  • MySQL

  • NoSQL

  • Python

  • Python模块

  • 机器学习

  • 设计模式

    • 设计模式的概念
    • 创建型模式
    • 单例(Singleton)模式
    • 原型(Prototype)模式
    • 工厂(Factory)模式
    • 建造者(Builder)模式
    • 结构型模式(Structural Pattern)
    • 适配器模式(Adapter Pattern)
      • 应用场景
      • 适配器模式的注意事项和细节
    • 桥接模式(Bridge Pattern)
    • 装饰器模式(Decorator、Wrapper(包装) Pattern)
    • 代理模式(Proxy Pattern)
    • 外观模式(Facade Pattern)
    • 组合模式(Composite Pattern)
    • 享元模式(Flyweight Pattern)
    • 行为型模式(Behavioral Patterns)
    • 模板方法(Template Method)
    • 策略(Strategy)模式
    • 状态(State)模式
    • 中介者(Mediator)模式
    • 观察者(Observer)模式
    • 备忘录(Memento)模式
    • 解释器(Interpreter)模式
    • 命令(Command)模式
    • 迭代器(Iterator)模式
    • 访问者(Visitor)模式
    • 职责链(Chain of Responsibility)模式
    • 总结
  • 传智健康

  • 畅购商城

  • 博客项目

  • JVM

  • JUC

  • Golang

  • Kubernetes

  • 硅谷课堂

  • C

  • 源码

  • 神领物流

  • RocketMQ

  • 短链平台

  • 后端
  • 设计模式
Iekr
2022-04-22
目录

适配器模式(Adapter Pattern)

# 适配器模式(Adapter Pattern)

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

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

image-20220422113944165

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

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

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

public interface Player {
    String play();
}

1
2
3
4
public interface Translator {
    String translate(String content);
}

1
2
3
4

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

public class MoviePlayer implements Player{

    @Override
    public String play() {
        System.out.println("正在播放视频 你好世界!!!");
        return "hello";

    }
}
1
2
3
4
5
6
7
8
9
public class zh_Translator implements Translator {
    @Override
    public String translate(String content) {
        if ("hello".equals(content)) {
            return "你好";
        } else if ("hello world".equals(content)) {
            return "你好 世界";
        } else {
            return "烫烫烫";
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12

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

继承的方式:类结构实现

image-20220422163100737

public class TranslatorPlayer extends zh_Translator implements Player {
    //被适配对象
    private Player target;

    public TranslatorPlayer(Player target) {
        this.target = target;
    }

    @Override
    public String play() {
        String play = target.play();
        //转换字幕
        String translate = translate(play);
        System.out.println("翻译字幕:" + translate);
        return translate;

    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

测试

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

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

image-20220422163109798

public class TranslatorPlayer  implements Player {
    //被适配对象
    private Player target;

    //翻译器
    private Translator translator = new zh_Translator();

    public TranslatorPlayer(Player target) {
        this.target = target;
    }

    @Override
    public String play() {
        String play = target.play();
        //转换字幕 组合方式
        String translate = translator.translate(play);
        System.out.println("翻译字幕:" + translate);
        return translate;

    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

测试

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

# 应用场景

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

SpringMvc 中的 HandlerAdapter, 就使用了适配器模式

SpringMVC 处理请求的流程回顾

使用 HandlerAdapter 的原因分析: 可以看到处理器的类型不同,有多重实现方式,那么调用方式就不是确定的,如果需要直接调用 Controller 方法,需要调用的时候就得不断是使用 if else 来进行判断是哪一种子类然后执行。那么如果后面要扩展 Controller,就得修改原来的代码,这样违背了 OCP 原则。

image-20231208203318142

# 适配器模式的注意事项和细节

  1. 三种命名方式,是根据 src 是以怎样的形式给到 Adapter(在 Adapter 里的形式)来命名的。
  2. 类适配器:以类给到,在 Adapter 里,就是将 src 当做类,继承 对象适配器:以对象给到,在 Adapter 里,将 src 作为一个对象,持有 接口适配器:以接口给到,在 Adapter 里,将 src 作为一个接口,实现
  3. Adapter 模式最大的作用还是将原本不兼容的接口融合在一起工作。
  4. 实际开发中,实现起来不拘泥于我们讲解的三种经典形式
编辑 (opens new window)
上次更新: 2023/12/13, 06:06:02
结构型模式(Structural Pattern)
桥接模式(Bridge Pattern)

← 结构型模式(Structural Pattern) 桥接模式(Bridge Pattern)→

最近更新
01
k8s
06-06
02
进程与线程
03-04
03
计算机操作系统概述
02-26
更多文章>
Theme by Vdoing | Copyright © 2022-2025 Iekr | Blog
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式