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 相关文章推荐
简介Django中内置的一些中间件
Jul 24 Python
剖析Python的Tornado框架中session支持的实现代码
Aug 21 Python
简单谈谈Python中的几种常见的数据类型
Feb 10 Python
Python利用正则表达式实现计算器算法思路解析
Apr 25 Python
使用Python进行QQ批量登录的实例代码
Jun 11 Python
对Python3 pyc 文件的使用详解
Feb 16 Python
python区块及区块链的开发详解
Jul 03 Python
Django 开发环境与生产环境的区分详解
Jul 26 Python
运用PyTorch动手搭建一个共享单车预测器
Aug 06 Python
使用Python代码实现Linux中的ls遍历目录命令的实例代码
Sep 07 Python
使用python turtle画高达
Jan 19 Python
详解Python 3.10 中的新功能和变化
Apr 28 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
咖啡知识 咖啡养豆要养多久 排气又是什么
2021/03/06 新手入门
人大复印资料处理程序_补充篇
2006/10/09 PHP
一道求$b相对于$a的相对路径的php代码
2010/08/08 PHP
Yii2框架自定义验证规则操作示例
2019/02/08 PHP
JQuery 操作Javascript对象和数组的工具函数小结
2010/01/22 Javascript
javascript简单实现表格行间隔显示颜色并高亮显示
2013/11/29 Javascript
js中回调函数的学习笔记
2014/07/31 Javascript
基于jquery实现省市联动效果
2015/11/23 Javascript
JSON字符串转换JSONObject和JSONArray的方法
2016/06/03 Javascript
AngularJS表达式讲解及示例代码
2016/08/16 Javascript
js和jquery中获取非行间样式
2017/05/05 jQuery
vue select组件的使用与禁用实现代码
2018/04/10 Javascript
[59:08]DOTA2上海特级锦标赛C组小组赛#2 LGD VS Newbee第一局
2016/02/27 DOTA
Python线程中对join方法的运用的教程
2015/04/09 Python
Python3.2中的字符串函数学习总结
2015/04/23 Python
整理Python中的赋值运算符
2015/05/13 Python
python函数装饰器用法实例详解
2015/06/04 Python
深入讲解Python函数中参数的使用及默认参数的陷阱
2016/03/13 Python
Python画图学习入门教程
2016/07/01 Python
Python方法的延迟加载的示例代码
2017/12/18 Python
理解python中生成器用法
2017/12/20 Python
详解python中@的用法
2019/03/27 Python
Python生成MD5值的两种方法实例分析
2019/04/26 Python
python 直接赋值和copy的区别详解
2019/08/07 Python
python中class的定义及使用教程
2019/09/18 Python
flask 实现上传图片并缩放作为头像的例子
2020/01/09 Python
python如何使用代码运行助手
2020/07/03 Python
python中添加模块导入路径的方法
2021/02/03 Python
深入浅析css3 中display box使用方法
2015/11/25 HTML / CSS
HTML5 video 事件应用示例
2014/09/11 HTML / CSS
中邮全球便购:中国邮政速递物流
2017/03/04 全球购物
澳大利亚最受欢迎的超级商场每日优惠:Catch
2020/11/17 全球购物
吧主申请感言怎么写
2015/08/03 职场文书
小学五年级班主任工作经验交流材料
2015/11/02 职场文书
解决springboot druid数据库连接失败后一直重连的方法
2022/04/19 Java/Android
Linux在两个服务器直接传文件的操作方法
2022/08/05 Servers