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中optparse模块使用浅析
Jan 01 Python
使用Python写个小监控
Jan 27 Python
python机器学习理论与实战(五)支持向量机
Jan 19 Python
Python统计单词出现的次数
Apr 04 Python
使用pandas中的DataFrame数据绘制柱状图的方法
Apr 10 Python
numpy.transpose对三维数组的转置方法
Apr 17 Python
Selenium的使用详解
Oct 19 Python
python画图--输出指定像素点的颜色值方法
Jul 03 Python
Django数据结果集序列化并展示实现过程
Apr 22 Python
详解Python中的路径问题
Sep 02 Python
Python基于unittest实现测试用例执行
Nov 25 Python
python实现剪贴板的操作
Jul 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
WINDOWS下php5.2.4+mysql6.0+apache2.2.4+ZendOptimizer-3.3.0配置
2008/03/28 PHP
基于PHP编程注意事项的小结
2013/04/27 PHP
基于AppServ,XAMPP,WAMP配置php.ini去掉警告信息(NOTICE)的方法详解
2013/05/07 PHP
纯PHP代码实现支付宝批量付款
2015/12/24 PHP
laravel框架实现后台登录、退出功能示例
2019/10/31 PHP
PHP框架实现WebSocket在线聊天通讯系统
2019/11/21 PHP
(jQuery,mootools,dojo)使用适合自己的编程别名命名
2010/09/14 Javascript
使用JQuery和CSS模拟超链接的用户单击事件的实现代码
2012/05/23 Javascript
Javascript new Date().valueOf()的作用与时间戳由来详解
2013/04/24 Javascript
JQuery加载图片自适应固定大小的DIV
2013/09/12 Javascript
jquery实现TAB选项卡鼠标经过带延迟效果的方法
2015/07/27 Javascript
使用堆实现Top K算法(JS实现)
2015/12/25 Javascript
仅30行代码实现Javascript中的MVC
2016/02/15 Javascript
深入理解(function(){... })();
2016/08/16 Javascript
微信小程序 switch组件详解及简单实例
2017/01/10 Javascript
微信小程序 实现列表项滑动显示删除按钮的功能
2017/04/13 Javascript
详解Vue.js组件可复用性的混合(mixin)方式和自定义指令
2017/09/06 Javascript
JavaScript解析JSON数据示例
2019/07/16 Javascript
jquery使用echarts实现有向图可视化功能示例
2019/11/25 jQuery
python中__call__方法示例分析
2014/10/11 Python
python实现爬虫下载美女图片
2015/07/14 Python
python解决pandas处理缺失值为空字符串的问题
2018/04/08 Python
Flask实现跨域请求的处理方法
2018/09/27 Python
Python的iOS自动化打包实例代码
2018/11/22 Python
python数据归一化及三种方法详解
2019/08/06 Python
Pytorch训练过程出现nan的解决方式
2020/01/02 Python
Tensorflow中批量读取数据的案列分析及TFRecord文件的打包与读取
2020/06/30 Python
python如何快速生成时间戳
2020/07/21 Python
Python爬虫代理池搭建的方法步骤
2020/09/28 Python
基于PyInstaller各参数的含义说明
2021/03/04 Python
CSS3 border-image详解、应用及jQuery插件
2011/08/29 HTML / CSS
巴西独家产品和现场演示购物网站:Shoptime
2019/07/11 全球购物
先进个人事迹材料
2014/01/25 职场文书
2014年创卫实施方案
2014/02/18 职场文书
先进个人事迹材料
2014/12/29 职场文书
java objectUtils 使用可能会出现的问题
2022/02/28 Java/Android