Python适配器模式代码实现解析


Posted in Python onAugust 02, 2019

Python适配器模式,代码,思考等

# -*- coding: utf-8 -*-
# author:baoshan
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 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 Adapter:
  def __init__(self, obj, adapted_methods):
    self.obj = obj
    self.__dict__.update(adapted_methods)
def __str__(self):
    return str(self.obj)
def main():
  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()

代码输出:

the Asus computer executes a program
the moog synthesizer is playing an electronic song
Bob the human says hello

------------------------------------------------------------------------------------------

我们设法使得Human和Synthesizer类与客户端所期望的接口兼容,且无需改变它们的源代码。这太棒了!

这里有一个为你准备的挑战性练习,当前的实现有一个问题,当所有类都有一个属性name时,以下代码会运行失败。

for i in objects:
    print('{}'.format(i.name))

首先想想这段代码为什么会失败?虽然从编码的角度来看这是有意义的,但对于客户端代码来说毫无意义,客户端不应该关心“适配了什么”和“什么没有被适配”这类细节。我们只是想提供一个统一的接口。该如何做才能让这段代码生效?

思考一下如何将未适配部分委托给包含在适配器类中的对象。

答案如下:

将适配器类更改如下,增加一行代码

class Adapter:
  def __init__(self, obj, adapted_methods):
    self.obj = obj
    self.__dict__.update(adapted_methods)
    self.name = obj.name
  def __str__(self):
    return str(self.obj)

然后在main函数中获取对应的name,如下

def main():
  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()))
    print('{}'.format(i.name))
if __name__ == '__main__':
  main()

输出结果如下:

the Asus computer executes a program
Asus
the moog synthesizer is playing an electronic song
moog
Bob the human says hello
Bob

参考自:《精通Python设计模式》

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python使用win32com库播放mp3文件的方法
May 30 Python
Python脚本获取操作系统版本信息
Dec 17 Python
Python获取二维矩阵每列最大值的方法
Apr 03 Python
浅谈Tensorflow模型的保存与恢复加载
Apr 26 Python
python对视频画框标记后保存的方法
Dec 07 Python
Python实现的线性回归算法示例【附csv文件下载】
Dec 29 Python
Jacobi迭代算法的Python实现详解
Jun 29 Python
Python 占位符的使用方法详解
Jul 10 Python
python 实现字符串下标的输出功能
Feb 13 Python
Python 实现向word(docx)中输出
Feb 13 Python
Python的property属性详细讲解
Apr 11 Python
python多次执行绘制条形图
Apr 20 Python
Python3网络爬虫开发实战之极验滑动验证码的识别
Aug 02 #Python
pandas中DataFrame修改index、columns名的方法示例
Aug 02 #Python
pandas DataFrame的修改方法(值、列、索引)
Aug 02 #Python
Flask框架钩子函数功能与用法分析
Aug 02 #Python
pandas DataFrame行或列的删除方法的实现示例
Aug 02 #Python
Python基于BeautifulSoup和requests实现的爬虫功能示例
Aug 02 #Python
详解pandas DataFrame的查询方法(loc,iloc,at,iat,ix的用法和区别)
Aug 02 #Python
You might like
php缓存技术介绍
2006/11/25 PHP
php中设置多级目录session的问题
2011/08/08 PHP
php命名空间学习详解
2014/02/27 PHP
CodeIgniter启用缓存和清除缓存的方法
2014/06/12 PHP
ThinkPHP整合百度Ueditor图文教程
2014/10/21 PHP
php基于双向循环队列实现历史记录的前进后退等功能
2015/08/08 PHP
让ie运行js时提示允许阻止内容运行的解决方法
2010/10/24 Javascript
js实现页面转发功能示例代码
2013/08/05 Javascript
js 实现菜单左右滚动显示示例介绍
2013/11/21 Javascript
Blocksit插件实现瀑布流数据无限( 异步)加载
2014/06/20 Javascript
jQuery实现“扫码阅读”功能
2015/01/21 Javascript
原生JS实现图片轮播与淡入效果的简单实例
2016/08/21 Javascript
很酷的星级评分系统原生JS实现
2016/08/25 Javascript
微信小程序之拖拽排序(代码分享)
2017/01/21 Javascript
详解vue嵌套路由-params传递参数
2017/05/23 Javascript
解决ztree搜索中多级菜单展示不全问题
2017/07/05 Javascript
js指定步长实现单方向匀速运动
2017/07/17 Javascript
vue使用ElementUI时导航栏默认展开功能的实现
2018/07/04 Javascript
JS Math对象与Math方法实例小结
2019/07/05 Javascript
nodejs环境使用Typeorm连接查询Oracle数据
2019/12/05 NodeJs
何时/使用 Vue3 render 函数的教程详解
2020/07/25 Javascript
Python模块学习 re 正则表达式
2011/05/19 Python
Python编程中time模块的一些关键用法解析
2016/01/19 Python
理解生产者消费者模型及在Python编程中的运用实例
2016/06/26 Python
浅谈使用Python变量时要避免的3个错误
2017/10/30 Python
用Python写脚本,实现完全备份和增量备份的示例
2018/04/29 Python
Django如何将URL映射到视图
2019/07/29 Python
Python 使用 docopt 解析json参数文件过程讲解
2019/08/13 Python
Python3.7+tkinter实现查询界面功能
2019/12/24 Python
Python GUI编程学习笔记之tkinter界面布局显示详解
2020/03/30 Python
JBL美国官方商店:扬声器、耳机等
2019/12/01 全球购物
eBay美国官网:eBay.com
2020/10/24 全球购物
计算机专业求职信
2014/06/02 职场文书
2015年教师个人业务工作总结
2015/10/23 职场文书
红灯733-1型14管5波段半导体收音机
2021/04/22 无线电
各种货币符号快捷输入
2022/02/17 杂记