适配器模式主要解决的问题保留旧版本的接口的基础上,新开发的接口能够兼容到旧版本的系统上。其实我们重构旧版本的代码也可以实现相应功能的开发,但是这就违背的了开放与封闭原则,因此我们不会轻易去修改旧代码,除非你要重构旧版本的代码,都是通过增量式开发,同时兼容旧版本。

设计模式这东西只有在你要优化当前系统的时候才会使用到,不可能一开始全部的系统都是以设计模式的思维来维护,这样的情况下这个系统得多久才能完成。

下面举个例子来直白的了解一下适配器模式:

在这里旧版本功能就是电脑执行一个程序,新功能就是要保证其旧版本功能的基础上加入播放音乐等功能。

class Synthesizer:

def __init__(self, name):

self.name = name

def __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 = name

def __str__(self):

return '{} the human'.format(self.name)

def speak(self):

return 'says hello'

适配的代码如下

class Computer:

def __init__(self, name):

self.name = name

def __str__(self):

return 'the {} computer'.format(self.name)

def execute(self):

return 'executes a program'

class Adapter:

def __init__(self, obj, adapted_methods):

self.obj = obj

self.__dict__.update(adapted_methods)

#self.__dict__['name']=obj.name

def __str__(self):

return str(self.obj)

运行代码

from chapter4 import adapter,external_1

def main():

objects = [adapter.Computer('Asus')]

synth = external_1.Synthesizer('moog')

objects.append(adapter.Adapter(synth, dict(execute=synth.play)))

human = external_1.Human('Bob')

objects.append(adapter.Adapter(human, dict(execute=human.speak)))

for i in objects:

print('{} {}'.format(str(i), i.name))

main()

这个是从设计模式书上摘抄过来的,书上留的一个问题是,现在Synthesizer,Human和Computer都具有相同的成员变量name,问如何修改适配器输出name

我在上面的适配器中注释部分即提供了解决方法,直接修改适配器中的__dict__成员,本来一开始想是用过重载__getattr__函数来实现属性的访问,但是你要注意到Computer类是没有对饮的obj变量的,所以你还是报错,这样是行不通的,所以最后还是修改__dict__达到成员属性变量的赋值。

python适配器模式角色_python设计模式-适配器模式相关推荐

  1. python适配器模式角色_Python设计模式之适配器模式原理与用法详解

    本文实例讲述了Python设计模式之适配器模式原理与用法.分享给大家供大家参考,具体如下: 适配器模式(Adapter Pattern):将一个类的接口转换成为客户希望的另外一个接口. 下面是一个适配 ...

  2. python实现解释器_Python设计模式之解释器模式

    解释器模式 对每个应用来说,至少有以下两种不同的用户分类. 基本用户:这类用户只希望能够凭直觉使用应用.他们不喜欢花太多时间配置或学习应用的内部.对他们来说,基本的用法就足够了. 高级用户:这些用户, ...

  3. python修饰器_python设计模式之修饰器模式

    python设计模式之修饰器模式 无论何时我们想对一个对象添加额外的功能,都有下面这些不同的可选方法. [ ] 如果合理,可以直接将功能添加到对象所属的类(例如,添加一个新的方法) [ ] 使用组合 ...

  4. python 命令模式_python 设计模式之命令模式

    命令模式介绍: 在面向对象编程中,命令模式是概括所有方法信息的设计模式. 此模式对象包涵方法名,及其相关参数值. 命令模式是一个分类的观察者设计模式,在命令模式下,对象被概括为一个命令表单,此表单包涵 ...

  5. python 命令模式_python设计模式(十六):命令模式-阿里云开发者社区

    "行为请求者"与"行为实现者"通常呈现一种"紧耦合".但在某些场合,比如要对行为进行"记录.撤销/重做.事务"等处理,这 ...

  6. Python设计模式-适配器模式

    Python设计模式-适配器模式 基于Python3.5.2,代码如下 #coding:utf-8class ACpnStaff:name = ""id = "" ...

  7. python适配器模式角色_适配器模式(Adapter模式)详解

    在现实生活中,经常出现两个对象因接口不兼容而不能在一起工作的实例,这时需要第三者进行适配.例如,讲中文的人同讲英文的人对话时需要一个翻译,用直流电的笔记本电脑接交流电源时需要一个电源适配器,用计算机访 ...

  8. 简述事件接口与事件适配器的联系与区别_设计模式——适配器模式

    适配器模式 适配器模式(Adapter Pattern):将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper).适配器模式既可以作为类结构型模式,也 ...

  9. C++设计模式——适配器模式(对象适配器、类适配器)

    http://blog.jobbole.com/109381/?winzoom=1 前言 现在的笔记本都只存在USB接口,用来口,电脑上存在的是USB接口,两者如何通信呢?可以使用USB转串口线连接电 ...

最新文章

  1. 全面解析 Kmeans 聚类算法(Python)
  2. 滴滴业务研发的精益实践
  3. 从源码分析DEARGUI之菜单
  4. keras画acc和loss曲线图
  5. 安卓2.2刷机包_老用户福音 努比亚为红魔电竞手机和Z17用户更新安卓9.0
  6. linux 常用命令01
  7. 本期课程已满,欢迎关注后续期次 | 临床基因组学数据分析实战助力解析Case,快速发表文章...
  8. 分布式技术追踪 2018年第二期
  9. Shiro 支持三种方式的授权
  10. 我与Bootstrap
  11. Magento 使用心得
  12. 【C++】常用排序算法
  13. 浅谈前端面向对象oop思想
  14. jmeter下载安装使用教程
  15. qemu运行linux内核很慢,bugfix: Qemu 运行 ARM Linux 5.0 必现启动死机
  16. 超五类和六类网线区别 什么样的网线好
  17. 国家医保移动支付国密算法SM2签名验签、SM4加解密测试工具
  18. 使用VLAN隔离虚拟机流量
  19. 紫罗兰永恒花园rust简谱_【口琴谱/简谱】エイミー(紫罗兰永恒花园外传主题曲)...
  20. Python+Turtle 魔法阵效果(简陋)

热门文章

  1. qhfl-9 微信模板消息推送
  2. 给字母保密的c语言,C语言练习题
  3. android怎么将editext的文本,android – 如何将文本添加到editext
  4. sql求平均日活_杨学峰博客 | Flask Sqlarchemy实现按日、周、月统计并图表展示
  5. 5点击换gif_工具:GIF动态图片制作小课堂,开课啦!
  6. 哈啰在分布式消息治理和微服务治理中的实践
  7. 架构设计 | 基于消息中间件,图解柔性事务一致性
  8. 阿里云成为首个通过《面向公有云模式的政务云服务》测评的厂商
  9. 因为阿里,他们成了“杭漂”
  10. 重磅!阿里开源自研语音识别模型DFSMN,准确率高达96.04%