设计模式---适配器模式(Adapter)

设计模式|适配器模式(Adapter Pattern) 适配器模式(Adapter Pattern)是一种结构型设计模式,用于将一个类的接口转换成客户端所期望的另一个接口。这种模式通常用于解决两个已有接口之间不兼容的情况。适配器模式使得不兼容的接口能够协同工作,而无需修改已有的代码。这对于集成已有代码库或者第三方组件时非常有用,因为它可以帮助在不破坏现有接口的情况下实现必要的功能补充。 阅读详情

适配器模式是将目标对象的接口转换为使用者所期望的另外一个接口,使得原本接口类型不一致的类能够更好的工作在一起。

使用场景:

两个类所做的事情相同或相似,但是具有不同的接口时要使用它。客户端可以统一调用同一接口,这样应该可以更简单、更直接、更紧凑。

一.需求提出

假设现在要求写一个程序,这个程序示意一个足球对的训练过程。这个足球队有着中方球员、外援。由于语言文化不同。中方球员和外籍球员的控制接口是不一致的。

二.无设计的实现

`

# -*- coding: utf-8 -*-

class chinese_player:
    def she_men(self):
        print('射门!!!')

    def fang_shou(self):
        print('铲球!!!')


class foreign_player:
    def shooting(self):
        print('shoot Door!!!')

    def defense(self):
        print('Tackle!!!')


class coach:
    def __init__(self, *team_plays):
        self._players = team_plays

    def trainning(self):

        for player in self._players:
            if isinstance(player, foreign_player):
                player.shooting()
                player.defense()
            elif isinstance(player, chinese_player):
                player.she_men()
                player.fang_shou()

            # 如果有更多的不同接口类型的球员,则需要写更多的分支


if __name__ == '__main__' :
	# 客户端

    wulei = chinese_player()
    elkeson = foreign_player()

    lipe = coach(wulei,elkeson)
    lipe.trainning()

`
主要的问题:

1> 当程序需要扩展,需要处理更多类型的球员时,Coach 类的 trainning 函数需要不断的去加分支。违反了开放封闭原则。

2> trainning中的isinstance接口,给人一个明显的信号就是要识别具体的对象类型,根据具体的类型再做具体的操作。明显的是依赖具体实现进行编程。违背了依赖倒置原则

附:

依赖倒置原则DIP(Dependency Inversion Principle):

高层模块不应该依赖于低层模块;二者都应该依赖于抽象。

抽象不应该依赖于细节;细节应该依赖抽象。

要针对接口编程,而不是针对实现编程。


单一职责原则SRP(Single Responsibility Principle):
就一个逻辑单元(类、函数)而言,应该仅有一个引起变化的原因。

分离关注点;正交设计;

三.适配器模式重构

在这里插入图片描述
`

class chinese_player:
    def she_men(self):
        print('射门!!!')

    def fang_shou(self):
        print('铲球!!!')


class foreign_player:
    def shooting(self):
        print('shoot Door!!!')

    def defense(self):
        print('Tackle!!!')


class translater:
    def __init__(self):
        self._player = chinese_player()

    def shooting(self):
        self._player.she_men()

    def defense(self):
        self._player.fang_shou()


class coach:
    def __init__(self, *team_plays):
        self._players = team_plays

    def trainning(self):
		# 无需再对player的类型做具体的判断和处理,针对shooting defense通用接口变成。
        for player in self._players:
            player.shooting()
            player.defense()


if __name__ == '__main__':
    # 为中国球员请个洋翻译:)
    wulei = translater()
    elkeson = foreign_player()

    lipe = coach(wulei, elkeson)
    lipe.trainning()

`

分析

1> translater类作为一个适配器,实现了 she_men ->shooting fang_shou->defense 函数接口的映射,让shooting 和 defense变为通用函数接口。

2> 有了适配器的函数接口转换,coach核心类的 trainning 接口,无需再做球员类型的具体判断,只需要针对通用接口编程即可。后续的功能扩展,也无需再对training接口进行变更。

Golang 设计模式系列4: 适配器模式(Adapter design pattern) 适配器模式(Adapter Pattern) :将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。 适配器模式包含如下角色: Target:目标抽象类 Adapter:适配器类 Adaptee:适配者类 Client:客户类 实现 Target:目标抽象类 type L... 阅读详情

相关推荐

(32)C#设计模式——适配器模式(Adapter Pattern)

引言 在实际的开发过程中,由于应用环境的变化,我们需要的实现在新环境中没有现存对象可以满足,但是其他环境却存在这样现存的对象。如何在新环境中调用“现存的对象”呢?采用适配器模式可以解决。适配器模式使得新环境中不需要去重复实现已经存在了的实现,而很好的把现有的对象(指原来环境中的现有对象)加入到新环境中来使用。 详细介绍 定义:把一个类的接口变换成客户端所期待的另一种接口,从而使得原本接口不匹...

编程菜鸟0604的博客 2020

设计模式-Adapter

意图:使控制范围之外的一个原有对象与某个接口匹配。问题:系统的数据和行为都正确,但接口不符。通常用于必须从抽象类派生时。实现:将原有类包含在另一类中。让包含类与需要的接口匹配,调用被包容类的方法。 Adapter模式有两种类型:对象Adapter模式:依赖于一个对象(适配对象),包含另一个对象(被适配对象)。类Adapter模式:通过多重继承实现。 类Adapter

russule的专栏 454

设计模式练习题

有关设计模式的练习题。设计模式的分类。等相关的联系。学西设计模式必选习题。有助于加强对于设计模式的理解。

设计模式:Adapter(适配器)模式

Adapter模式,适配器模式 模式描述: 有时候我们需要改变接口,那么接口改变后如何让原有的方法适配新的接口?这是我们经常需要考虑的。Adapter模式将一个类的接口转换成我们希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 Adapter模式的关键特征: 意图:使控制范围之外的一个原有对象与某个接口匹配。 问题:系统的数

lishuzhai的专栏 664

<202505高项>《【VIP合集】 软考高项(第四版)十大知识域、五大过程组、ITTO输入输出工具、项目绩效域》

软考高项(第四版)十大知识域、五大过程组、ITTO输入输出工具、项目绩效域

Else 的博客 1850

DiffusionDrive实战:如何用截断扩散模型3个月搞定自动驾驶轨迹规划(附代码)

本文详细介绍了如何利用DiffusionDrive截断扩散模型,在三个月内快速构建端到端的自动驾驶轨迹预测系统。内容涵盖从环境搭建、数据处理、模型架构解析到训练调参和推理优化的完整实战流程,并提供了关键代码示例,旨在帮助开发者高效实现高质量的自动驾驶轨迹规划。

weixin_35578748的博客 143

设计模式 - C++ - Adapter模式

设计模式 - C++ - Adapter模式1. 适配器(Adapter模式、Wrapper模式、包裹器模式)的现实意义        (1) 手机充电:现在的手机数据线一般可以充当着充电连接线的角色。我们需要充电的时候只要把数据线接上电脑USB口即可。如果身边没有电脑,则可以将

trojanpizza的专栏 2420

华为OD机试新系统真题【计算电动车续航里程】

华为OD机试 新系统真题【计算电动车续航里程】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【计算电动车续航里程】多语言题解。

qq_45776114的博客 779

C++设计模式——适配器模式(Adapter Pattern)

C++设计模式——适配器模式(Adapter Pattern) 微信公众号:幼儿园的学霸 目录 文章目录C++设计模式——适配器模式(Adapter Pattern)目录定义定义作用/解决的问题适配器模式中的角色代码示例总结优缺点适用场景参考资料 定义 定义 Convert the interface of a class into another interface clients expect. Adapter lets classes work together that couldn’t ot

leonardohaig的博客 1547

枪支/刀具检测 (gun, knife) - SIXray, Clasp Dataset,YOLOv11+UI界面+数据集

python复制编辑# 计算 CIoU 损失。

YOLO 538

2026 年 3 月青少年软编等考 C/C++ 三级测试题解析

摘要 本文包含三部分内容: 单选题(10题):考察C++基础语法和数据结构知识,涉及vector、栈、队列的操作和特性。 判断题(10题):测试对动态数组、栈、队列、字符串操作的理解,包括内存管理、访问方式和函数返回值等。 编程题(1题):模拟火车站售票窗口排队场景,要求根据输入输出各窗口的排队情况,重点考查队列的实际应用和边界条件处理。 答案解析详细,涵盖常见编程考点,适合检验基础知识的掌握程度。

发布少儿编程考级的真题和优秀竞赛题解析,以及一些讲义。 248

设计模式之适配器模式(Adapter Design Pattern)

适配器是接口转换器,为需要在一起工作但不兼容的两个接口桥梁。 适配器是常用的设计模式之一,现在是互联网时代,很多应用程序都会调用第三方的接口,比如支付接口、短信接口、验证码接口、数据对象存储接口等。而这些接口都是不一样的,如果在应用中要调用多个接口完成相同功能,就需要适配器。 适配器在生活中也很常见,如果手机充电器,笔记本充电器,都是电源适配器。在我国家里所使用的是220伏的电源电压,美国等国外有的使用110V电源电压,而普遍的电子产品一般所需的电源电压为5伏至20伏左右。如果没有电源适配器,这些电子产

xjj1314的专栏 461

Linux iperf 进行跑流测试时,为啥单条流会有速率上不去的问题?

iperf

1042484520@qq.com(邮箱) 3086

设计模式:适配器模式(Adapter Pattern)

适配器模式是一种结构型设计模式,其核心目的是:将一个类的接口转换成客户端期望的接口,使原本由于接口不兼容而不能一起工作的类可以协同工作。换句话说,它就像现实生活中的插头适配器:你想插电器,但插头类型不匹配,适配器帮你转换接口。

TechNomad的博客 1510

【FPGA教程案例89】编译码2——使用vivado核实现RS信道编译码

RS编码,又称里所码,即Reed-solomon codes,是一种前向纠错的信道编码,对由校正过采样数据所产生的多项式有效。当接收器正确的收到足够的点后,它就可以恢复原来的多项式,即使接收到的多项式上有很多点被噪声干扰失真。

FPGA/MATLAB学习教程/源码/项目合作开发 3540

低功耗设计:如何计算power switch的数量?

power switch加多了漏电高,加少了ir drop会有问题,具体加多少合适要如何计算呢?这里可以给一个参考方式。 第一步,先选switch cell的类型 通常选用HVT类型的switch cell,优点是漏电更低,缺点也很明显,电阻大,压降也大,switch cell的大小选择,可以选择(开启电阻x面积)最小的switch cell,即单位面积提供最小并联电阻的cell类型。 第二步,计算数量 选好类型,确定了开启电阻,可以按照如下公式计算数量: Ron/Xnum • W/V = V•P

m0_61544122的博客 3570

设计模式教程:适配器模式(Adapter Pattern)

将一个类的接口转换成客户期望的另一个接口,使得原本接口不兼容的类能够一起工作。

遇见伯灵说的博客 1816

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

设计模式-适配器模式(Adapter Pattern)

适配器模式 定义 将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作。 分类 类适配器、对象适配器。 角色 目标接口:Target,该角色把其他类转换为我们期望的接口。 被适配者: Adaptee ,原有的接口,也是希望被适配的接口。 适配器: Adapter, 将被适配者和目标接口组合到一起的类。 适用场景 想要使用一个已经存在的类,但是它却不符合现有的接口规范,导致无法直...

kaven 4894

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

23种设计模式之适配器模式(Adapter Pattern)

、本篇文章将23种设计模式中的适配器模式,此篇文章为一天学习一个设计模式系列文章,后面会分享其他模式知识。

小威的博客 2万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

设计模式6:Adapter Pattern (适配器模式)

来自于:http://www.cnblogs.com/zhenyulu/articles/39386.html参考于:http://www.dofactory.com/Patterns/PatternAdapter.aspx一、 适配器(Adapter)模式适配器模式把一个类的接口变换成客户端所期待的另一种接口,从而使原本接口不匹配而无法在一起工作的两个类能够在一起工作。名称由来

薛敬明的专栏 2751

设计模式-05适配器模式Adapter Pattern

适配器模式摘要 适配器模式是一种结构型设计模式,用于解决接口不兼容问题。它通过将一个类的接口转换成客户期望的另一个接口,使原本不兼容的类能够协同工作。 核心特点: 包含目标接口(Target)、适配器(Adapter)和被适配者(Adaptee)三个角色 提供两种实现方式:类适配器(继承)和对象适配器(组合) 适用于复用现有类但其接口不符合需求的情况 典型应用: 如媒体播放器示例中,AudioPlayer通过适配器支持VLC和MP4等不同格式的播放器,而无需修改原有播放器代码。双向适配器还可实现接口间的双向

d3y1`5 81_09 900

设计模式--适配器模式 Adapter Pattern

(1)适配器模式将某个类的接口转换成为客户端期望的另一个接口表示,主要的目的是兼容性,让原本应接口不匹配不能一起工作的两个类可以协同工作。其别名为包装器(Wrapper).(2)适配器模式属于结构型模式(3)主要分为三类:类适配器模式、对象适配器模式、接口适配器模式。

m0_63622279的博客 1009

设计模式-适配器模式-adapter pattern

类适配器通过继承实现适配,适用于适配者接口较为固定的情况。对象适配器通过组合实现适配,提供了更高的灵活性,可以在运行时动态改变适配者对象。接口适配器通常用于适配多个具有不同接口的适配者,通过实现多个接口来统一调用。在实际开发中,选择哪种适配器模式取决于具体的设计需求和现有的代码结构。

wesigj的博客 1861

设计模式——适配器模式(Adapter Pattern)

适配器模式又叫变压器模式。它的功能是将一个类的接口变成客户端所期待的另一个类的接口,从而使原本因接口不匹配而无法一起工作的两个类可以一起工作。属于结构型设计模式。

Lucifer ZHAO 303

Java设计模式—适配器模式(Adapter Pattern)

适配器模式(Adapter Pattern)是一种结构型设计模式;用于将一个类的接口转换成另一个接口,从而满足客户端对接口的需求;在适配器模式中,适配器充当一个中间层,通过实现目标接口并持有原始类的实例来实现对原始类的封装和转换。客户端只需要调用目标接口中定义的方法即可完成对原始类的调用。适配器模式在Java中广泛应用于各种场景,例如,将旧版API适配到新版API、将不同的数据格式适配到统一的数据格式等。所以,适配器模式是个非常非常重要的,是个非常强的设计模式!

是个非常热爱生活、乐观、奋斗、努力的逗比青年 4067
上一篇: 设计模式---职责链(Chain Of Responsibility)
下一篇: 设计模式---中介者模式
牛屁哄哄叫兽
博客等级 码龄18年 56粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值