结构型设计模式

结构型设计模式处理一个系统中不同实体(比如,类和对象)之间的关系,关注的是提供一种简单的对象组合方式来创造新功能。

适配器模式

适配器模式是一种结构型设计模式,帮助我们实现两个不兼容接口之间的兼容。首先,解释一下不兼容接口之间的真正含义。如果我们希望把一个老组件用于一个新系统中,或者把一个新组件用于一个老系统中,不对代码进行任何修改就能通信的情况很少见。但又并非总是能修改代码,或因为我们无法访问这些代码(例如,组件以外部库的方式提供)。在这些情况下,我们可以编写一个额外的代码层,该代码层包含让两个接口之间能够通信需要进行的所有修改。这个代码层就叫适配器。
生活中的例子:如果你有一部智能手机或一台平板电脑,在想把它连接到你的电脑上,就需要使用一个适配器。

应用案例:
在某个产品制造出来之后,需要对新的需求之时,如果希望其仍然有效,则可以使用适配器模式。通常两个不兼容接口中的一个是他方的或是老旧的。如果一个接口是他方的,那就意味着无法访问源码。如果是老旧的,那么对其重构通常是不切实际的。更进一步,我们可以说修改一个老旧组件的实现以满足我们的需求,不仅是不切实际的,也违反了开放/封闭原则。开放/封闭原则是面向对象设计的基本原则之一,声明一个软件实体应该对扩展是开放的,对修改则是封闭的。本质上这意味着我们应该无需修改一个软件实体的源代码就能扩展其行为。适配器模式遵从开放/封闭原则。

#我们的应用有一个Computer类,用来显示一台计算机的基本信息。我们决定用更多的功能来丰富应用,我们很幸运地在两个与我们应用无关的代码库中发现两个有意思的类,Synthesizer和Human。#在Synthesizer类中,主要动作由play()方法执行。在Human类中,主要动作由speak()执行。为了表明这两个类是外部的,将其放在一个单独的模块中。现在有一个问题,客户端仅知道如何调用execute()方法,并不知道play()和speak()。在不改变Synthesizer和Human的前提下,我们该如何做才能让代码有效?#答案是在test.py中创建一个通用的Adapter类,将一些不同接口的对象适配到统一的接口中。

#Computer类 在test.py文件中
class Computer:def __init__(self,name):self.name = namedef __str__(self):return 'the {} computer'.format(self.name)def execute(self):return 'executes a program'

#在external.py文件中
class Synthesizer:def __init__(self,name):self.name = namedef __str__(self):return 'the {} synthesizer'.format(self.name)def play(self):return 'is playing an electronic song'class Human:def __init__(self,name):self.name = namedef __str__(self):return '{} the human'.format(self.name)def speak(self):return 'says hello'

#增加适配器后的test.py文件
from external import Synthesizer,Humanclass Computer:def __init__(self,name):self.name = namedef __str__(self):return 'the {} computer'.format(self.name)def execute(self):return 'executes a program'#创建适配器类
class Adapter:#obj使我们想要适配的对象,adapted_methods是一个字典,# 键值对中的键是客户端要调用的方法,值是应该被调用的方法def __init__(self,obj,adapted_methods):self.obj = objself.__dict__.update(adapted_methods)def __str__(self):return str(self.obj)def main():#列表objects容纳着所有对象。属于Computer类的可兼容对象不需要适配#不兼容的对象则不能直接添加,使用Adapter类来适配它们。objects = [Computer('Asus')]synth = Synthesizer('moog')objects.append(Adapter(synth,dict(execute=synth.play)))human = Human('Bob')objects.append(Adapter(human,dict(execute=human.speak)))for i in objects:print('{} {}'.format(str(i),i.execute()))if __name__ == '__main__':main()

小结

适配器让一件产品在制造出来之后需要应对新的需求时还能工作。在上面的例子中,我们看到如何使用适配器模式,无需修改不兼容模型的源代码就能获得接口的一致性。虽然在Python中我们可以沿袭传统方式使用子类(继承)来实现适配器模式,但是这种技术是一种很棒的替代方案。

转载于:https://www.cnblogs.com/xiaoshayu520ly/p/10983342.html

结构型模式---适配器模式相关推荐

  1. 结构型模式 适配器模式

    结构型模式 适配器模式 适用于:  是将一个类的接口转换成客户希望的另外一个接口.使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. /*** 结构型模式 适配器模式* Adapter模式也叫 ...

  2. 8、设计模式-结构型模式-适配器模式

    适配器模式 在软件开发中,有时也存在类似这种不兼容的情况 引入一个称之为适配器的角色来协调这些存在不兼容的结构 这种设计方案即为适配器模式 在适配器模式中引入了一个被称为适配器(Adapter)的包装 ...

  3. 《设计模式详解》结构型模式 - 适配器模式

    适配器模式 5.2 适配器模式 5.2.1 概述 5.2.2 结构 5.2.3 类适配器模式 5.2.4 对象适配器模式 5.2.5 接口适配器模式 5.2.6 应用场景 5.2.7 JDK 源码 - ...

  4. 图解Java设计模式学习笔记——结构型模式(适配器模式、桥接模式、装饰者模式、组合模式、外观模式、享元模式、代理模式)

    一.适配器模式(类适配器.对象适配器.接口适配器) 1.现实生活中的例子 泰国插座用的是两孔的(欧标),可以买个多功能转换插头(适配器),这样就可以使用了国内的电器了. 2.基本介绍 适配器模式(Ad ...

  5. 结构型模式——适配器模式

    一. 实验目的与要求 1.练习使用适配器模式.设计相关的模拟场景并进行实施,验证模式特性,掌握其优缺点. 2.实验结束后,对相关内容进行总结. 二.实验内容 1.模式应用场景说明 现在喜欢上网的年轻人 ...

  6. 设计模式-结构型模式 适配器模式adapter

    设配器模式分为 类适配器模式 对象适配器模式,主要目的是 将适配者 与目标接口结合 类适配器模式: 目标接口 适配者 适配器 缺点:耦合度高 对象适配器:对类适配器 进行修改 继承改为聚合 关系 降低 ...

  7. 结构型模式——适配器模式(Adapter)

    文章目录 什么是适配器模式 适配器模式的结构 代码展示 定义目标类和目标接口 定义电脑类 编写测试类 适配器模式测试 定义适配者类接口和子类对象 定义适配器类 编写测试类 整体类型结构图 结论 弊端 ...

  8. 设计模式 — 结构型模式 — 适配器模式

    目录 文章目录 目录 适配器模式 应用场景 代码示例 方式一 方式二 适配器模式 适配器,顾名思义是一种万能的接口,达到万能转换的效果. 适配器模式,定义一个适配器类,并且在该类中定义了适配器接口,这 ...

  9. 4.8_adapter_结构型模式:适配器模式

    结构型模式 --- 适配器模式 --- 内容:将一个类的接口转换成客户希望的另一个接口使原本由于接口不兼容而不能一起工作的那些类,可以一起工作实现方式:1. 类适配器:使用多继承2. 对象适配器:使用 ...

最新文章

  1. 【一天一个shell命令】文本操作系列-touch
  2. 测试opencv-CUDA是否安装成功简单程序
  3. tensorflow 显存 训练_【他山之石】训练时显存优化技术——OP合并与gradient checkpoint...
  4. 完整的连接器设计手册_Harwin连接器展示在深井探油应用中不受环境影响的价值...
  5. JAVA编程心得-Eclipse/MyEclipse 中文乱码解决办法
  6. Vue 跳转相同路由携带不同参数,而页面不刷新
  7. 前端Http协议缓存初解
  8. Rabbit MQ 配置
  9. Bert和一些以Bert为基础的预训练模型的Mask区别
  10. 人工智能+眼科疾病辅助诊断(相关信息搜集)
  11. C++--第21课 - 类模板 - 上
  12. Linux Mint 19 Tara x86_64安装Docker-ce
  13. 欢迎关注异贝!今天与您一起分享服装行业异贝引客方案设计!
  14. 文献html阅读器,强烈推荐文献阅读器CAJviewer——大学生阅读文献、论文必备工具!!!...
  15. 银耳椰椰——Alpha冲刺Day09
  16. python matrix用法_numpy中matrix使用方法
  17. 无刷新假象   实现简易文件上传
  18. RedHat7.6 配置yum源
  19. Dedecms 5.7 SP2后台广告管理处getshell
  20. 大数据时代物联网技术发展前景与应用分析

热门文章

  1. php页面在线人数,也谈php网站在线人数统计
  2. python 自定义词典_pyhanlp用户自定义词典添加
  3. python语言解释器的全部代码都是开源的_Python IDE和解释器的区别是什么?
  4. mathcal 对应于什么库_如何快速构建React组件库
  5. 使用proxy来调用未定义的属性方法
  6. 进阶学习(3.4) Builder Pattern 建造者模式
  7. 每个网站SEO优化人员都要熟知的三大图片优化技巧
  8. nacos持久化配置MySQL8_Nacos 数据持久化 mysql8.0
  9. latex hyperref_LaTeX 使用心得
  10. Android固定宽度文字自适应大小