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利用hook技术破解https的实例代码
Mar 25 Python
Python中用于转换字母为小写的lower()方法使用简介
May 19 Python
Python使用迭代器打印螺旋矩阵的思路及代码示例
Jul 02 Python
python的unittest测试类代码实例
Dec 07 Python
酷! 程序员用Python带你玩转冲顶大会
Jan 17 Python
Python中将dataframe转换为字典的实例
Apr 13 Python
Python APScheduler执行使用方法详解
Dec 10 Python
python pillow库的基础使用教程
Jan 13 Python
AI:如何训练机器学习的模型
Apr 16 Python
python控制台打印log输出重复的解决方法
May 14 Python
python随机打印成绩排名表
Jun 23 Python
Python Django获取URL中的数据详解
Nov 01 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 执行系统外部命令 system() exec() passthru()
2009/08/11 PHP
php中通过Ajax如何实现异步文件上传的代码实例
2011/05/07 PHP
php实现的太平洋时间和北京时间互转的自定义函数分享
2014/08/19 PHP
php中遍历二维数组并以表格的形式输出的方法
2017/01/03 PHP
PHP工厂模式的日常使用
2019/03/20 PHP
JavaScript让IE浏览器event对象符合W3C DOM标准
2009/11/24 Javascript
javascript 判断中文字符长度的函数代码
2012/08/27 Javascript
javascript控制Div层透明属性由浅变深由深变浅逐渐显示
2013/11/12 Javascript
js过滤特殊字符输入适合输入、粘贴、拖拽多种情况
2014/03/22 Javascript
JS小游戏之宇宙战机源码详解
2014/09/25 Javascript
node.js中的http.createServer方法使用说明
2014/12/14 Javascript
node.js中的fs.rmdir方法使用说明
2014/12/16 Javascript
JS实现星星评分功能实例代码(两种方法)
2016/06/09 Javascript
jQuery基本筛选选择器实例代码
2017/02/06 Javascript
JS+CSS实现滚动数字时钟效果
2017/12/25 Javascript
详解Vue.js项目API、Router配置拆分实践
2018/03/16 Javascript
webpack4 SCSS提取和懒加载的示例
2018/09/03 Javascript
vue实现同一个页面可以有多个router-view的方法
2018/09/20 Javascript
解决VUE 在IE下出现ReferenceError: Promise未定义的问题
2020/11/07 Javascript
使用Python中的cookielib模拟登录网站
2015/04/09 Python
Django验证码的生成与使用示例
2017/05/20 Python
python中numpy.zeros(np.zeros)的使用方法
2017/11/07 Python
几种实用的pythonic语法实例代码
2018/02/24 Python
python爬虫爬取快手视频多线程下载功能
2018/02/28 Python
Python最小二乘法矩阵
2019/01/02 Python
Python中Numpy mat的使用详解
2019/05/24 Python
python使用itchat模块给心爱的人每天发天气预报
2019/11/25 Python
Pycharm自动添加文件头注释和函数注释参数的方法
2020/10/23 Python
美国最大网上鞋店:Zappos
2016/07/25 全球购物
美国现代家具和家居商店:Apt2B
2016/08/29 全球购物
世界上最大的隐形眼镜商店:1-800 Contacts
2018/11/03 全球购物
简述Linux文件系统通过i节点把文件的逻辑结构和物理结构转换的工作过程
2016/01/06 面试题
新闻专业推荐信范文
2013/11/20 职场文书
世界名著读书笔记
2015/06/25 职场文书
2019下半年英语教师的教学工作计划(3篇)
2019/09/25 职场文书
python基础入门之普通操作与函数(三)
2021/06/13 Python