初识设计模式 - 适配器模式

适配器在生活中经常见到,如手机、笔记本电脑的电源适配器,USB 转接头都是常见的适配器。

在设计模式当中,适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。

在类适配器模式中,适配器与适配者之间是继承(实现)关系;在对象适配器模式中,适配器与适配者之间是关联关系。

具体实现

类适配器模式

典型的类适配器模式代码示例如下:

 
class Adapter extends Adaptee implements Target {
public void request() {
// 转发调用
super.specificRequest();
}
}

从上述的代码可以看出,典型的类适配器模式就是通过继承的方式,使用子类方法调用父类的方法,使用者在使用时面对的是适配器类而不是原始类。

对象适配器模式

典型的对象适配器模式代码示例如下:

 
class Adapter extends Target {
// 维持一个对适配者的引用
private Adaptee adaptee;
public Adapter(Adaptee adaptee) {
this.adaptee = adaptee;
}
public void request() {
// 转发调用
adaptee.specificRequest();
}
}

代理、桥接、装饰器、适配器的区别

笼统地说,这 4 种设计模式可以称为 Wrapper 模式,也就是通过 Wrapper 类二次封装原始类。

尽管它们的代码结构类似,但这 4 种设计模式的用意完全不同,以下是它们简要描述:

  • 代理模式:代理类在不改变原始类接口的条件下,为原始类定义一个代理类,主要目的是控制访问,而非加强功能,这是它与装饰器模式最大的不同
  • 桥接模式:桥接模式的目的是将接口部分和实现部分分离,从而让它们可以较为容易、也相对独立地加以改变
  • 装饰器模式:装饰器模式在不改变原始类接口的情况下,对原始类功能进行加强,并且支持多个装饰器的嵌套使用
  • 适配器模式:适配器提供跟原始类不同的接口,而代理模式、装饰器模式提供的都是跟原始类相同的接口,适配器模式是一种事后的补救策略

总结

优点

适配器模式的主要优点如下:

  • 将目标类和适配者类解耦
  • 增加了类的透明性和复用性
  • 灵活性和扩展性都非常好

除上述以外,对象适配器模式还有以下优点:

  • 一个对象适配器可以把多个不同的适配器适配到同一个目标
  • 可以适配一个适配者的子类

缺点

类适配器模式的主要缺点如下:

  • 对于不支持多重继承的编程语言,一次最多只能适配一个适配者类,不能同时适配多个适配者
  • 适配者类必须是可被继承的
  • 对于不支持多重继承的编程语言,类适配器模式中的目标抽象类只能为接口,不能为类,其使用有一定的局限性

对象适配器模式的主要缺点如下:

  • 与类适配器模式相比,要在适配器中置换适配者类的某些方法比较麻烦

适用场景

适配器模式的适用场景如下:

  • 封装有缺陷的接口设计
  • 统一多个类的接口设计
  • 替换依赖的接口设计
  • 兼容老版本接口
  • 适配不同格式的数据

源码

在 Java 中,SLF4J 日志框架不仅仅提供了统一的接口定义,还提供了针对不同日志框架的适配器。对不同日志框架的接口进行二次封装,适配成统一的 SLF4J 接口定义。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/6477.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python入门教程+项目实战-7.2节: 循环控制结构

目录 7.2.1 理解循环控制 7.2.2 for循环结构 7.2.3 while循环结构 7.2.4 循环结构可以嵌套 7.2.5 知识要点 7.2.6 系统学习python 7.2.1 理解循环控制 理解循环控制,首先得理解什么是循环。以下内容引自汉语词典: 循环意指往复回旋,指事物周而复…

【Python入门第四十二天】Python丨NumPy 数组裁切

裁切数组 python 中裁切的意思是将元素从一个给定的索引带到另一个给定的索引。 我们像这样传递切片而不是索引:[start:end]。 我们还可以定义步长,如下所示:[start:end:step]。 如果我们不传递 start&…

自定义starter

spring boot 在配置上相比spring要简单许多, 其核心在于spring-boot-starter, 在使用spring boot来搭建一个项目时, 只需要引入官方提供的starter, 就可以直接使用, 免去了各种配置。starter简单来讲就是引入了一些相关依赖和一些初始化的配置。 开发starter 创建starter工程…

OBProxy 路由策略与使用运维-常见问题

启动失败 机器是否存在 hostname :输入hostname -i, 确认host ip是否存在 目录是否存在,权限是否正确:确保当前目录下有读、写、执行的权限 端口是否被占用:使用obproxyd.sh启动OBProxy, 使用的端口为2883 启动环境是否指定正…

FIFO的工作原理及其设计

1.简介 FIFO( First Input First Output)简单说就是指先进先出。FIFO存储器是一个先入先出的双口缓冲器,即第一个进入其内的数据第一个被移出,其中一个口是存储器的输入口,另一个口是存储器的输出口。 对于单片FIFO来说,主要有两种…

C语言程序环境和预处理

文章目录程序的翻译环境和执行环境详解编译和链接翻译环境编译本身也分为几个阶段预处理编译汇编链接段表符号表的合并预处理详解预定义符号#define#define 定义标识符#define定义宏#define替换规则#和#### 的作用带副作用的宏参数宏和参数的对比宏和函数的一个对比命名约定#un…

USB抓包分析

1、USB传输协议基本概念 一个传输(控制、批量、中断、等时):由多个事务transaction组成; 一个事务transaction (IN、OUT、SETUP):由一多个包Packet组成。USB数据在主机与usb设备间被传输,之间的关联叫做管道pipe。一个USB设备可以…

【C语言蓝桥杯每日一题】—— 递增序列

【C语言蓝桥杯每日一题】—— 递增序列😎前言🙌递增序列🙌总结撒花💞😎博客昵称:博客小梦 😊最喜欢的座右铭:全神贯注的上吧!!! 😊作者…

操作系统结构

操作系统结构前言分层法模块化宏内核与微内核宏内核微内核外核经典试题前言 随着操作系统功能的不断增多和代码的规模的不断扩大,提供合理的结构,对于降低操作系统复杂度、提升操作系统安全与可靠性来说变得尤为重要。 分层法 分层法是将操作系统分为…

【从零开始学习 UVM】10.7、UVM TLM —— TLM Fifo [uvm_tlm_fifo]

文章目录 UVM TLM FIFO Example1. 创建一个发送器类,其端口类型为 `uvm_blocking_put_port`2. 创建接收器类,使用 get 方法进行接收。3. 通过高层次的 TLM FIFO 连接这两个组件假设发送方的数据速率比接收方获取数据包的速率快得多。需要在两者之间插入一个FIFO元素来存储数据…

[windows-rs]Rust 调用 Windows API

1、VSCode编辑器 下载安装VSCode 安装VSCode扩展 rust-analyzer或rust-analyzer(CN)(新手应该在rust-analyzer运行完毕后再动键盘)cratesBetter TOML 2、安装Microsoft C 生成工具 访问微软官网下载生成工具,勾选使用 C 的桌面开发之后会自动勾选5个项目 取消勾…

2023-4-1刷提情况

[蓝桥杯 2022 省 B] 积木画 题目描述 小明最近迷上了积木画,有这么两种类型的积木,分别为 III 型(大小为 222 个单位面积) 和 LLL 型 (大小为 333 个单位面积): 同时,小明有一块面积大小为 2N2 \times N2N 的画布,画…

C++内存模型

目录 一.内存分区 二,分区顺序 1 程序运行前 2 程序运行后 3.new操作符 一.内存分区 内存分区意义:不同区域存放的数据,赋予不同的生命周期, 给我们更大的灵活编程 内存可以分为以下几个区: 代码区:存放函数体的二进制代码…

LeetCode-5. 最长回文子串

目录题目思路动态规划题目来源 5. 最长回文子串 题目思路 本题和LeetCode-647. 回文子串基本一样,只是增加了几行代码 动态规划 1.确定dp数组(dp table)以及下标的含义 布尔类型的dp[i][j]:表示区间范围[i,j] (注…

Docker基础操作

关于Docker(https://hub.docker.com/)微服务虽然具备各种各样的优势,但服务的拆分通用给部署带来了很大的麻烦。分布式系统中,依赖的组件非常多,不同组件之间部署时往往会产生一些冲突。在数百上千台服务中重复部署&am…

c++编写动态星空

在今天之前,你能想象用C/C几十行代码就能做出上面这个轨范吗? 代码实现 在EasyX的文档中,就有这么一个Demo轨范。我们先来分析一下这段代码。 代码构造大要如下: 1. 星星构造体 经由过程构造体保留每克星星的位置信息、颜色信…

我在 bilibili 学代码审计

前几天在 B 站上看到一节录播课,感觉学习到了很多东西,反复观看仍不过瘾,所以决定写下这篇文章以做笔记。漏洞简介漏洞起源于前段时间比较火的小皮 1-click 漏洞,用户名登录处缺少过滤,导致可以直接构造恶意 payload 实…

Haar特征

文章目录1.Introduction2.Haar特征计算详解3.使用sklearn计算Haar特征参考资料欢迎访问个人网络日志🌹🌹知行空间🌹🌹 1.Introduction Rapid Object Detection using a Boosted Cascade of Simple Features Haar特征是由Viola和Jo…

【CSS】课程网站横版导航栏 ( 横版导航栏测量及样式 | 代码示例 )

文章目录一、盒子测量及样式1、总体盒子测量及样式2、左侧盒子测量及样式3、中间盒子测量及样式4、右侧盒子测量及样式二、横版导航栏代码示例1、HTML 标签结构2、CSS 样式3、显示效果绘制矩形框中的部分 : 一、盒子测量及样式 盒子样式如下 : 1、总体盒子测量及样式 该盒子是…

Linux中vi编辑器使用及ps系统管理命令

Vi和vim编辑器 vi编辑器是所有Unix及[Linux](http://www.2cto.com/os/linux/)系统下标准的编辑器,他就相当于windows系统中的记事本一样,它的强大不逊色于任何最新的文本编辑器。他是我们使用Linux系统不能缺少的工具。由于对Unix及Linux系统的任何版本&…
最新文章