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实现倒计时的示例
Feb 14 Python
Python3.2中Print函数用法实例详解
May 19 Python
python用户评论标签匹配的解决方法
May 31 Python
mac下pycharm设置python版本的图文教程
Jun 13 Python
实例分析python3实现并发访问水平切分表
Sep 29 Python
Python tkinter的grid布局及Text动态显示方法
Oct 11 Python
对django xadmin自定义菜单的实例详解
Jan 03 Python
如何使用Python实现自动化水军评论
Jun 26 Python
python selenium循环登陆网站的实现
Nov 04 Python
使用python求解二次规划的问题
Feb 29 Python
matplotlib基础绘图命令之errorbar的使用
Aug 13 Python
如何将numpy二维数组中的np.nan值替换为指定的值
May 14 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
避免Smarty与CSS语法冲突的方法
2015/03/02 PHP
thinkphp自带验证码全面解析
2016/09/18 PHP
Thinkphp实现短信验证注册功能
2016/10/18 PHP
Web 前端设计模式--Dom重构 提高显示性能
2010/10/22 Javascript
利用JQuery动画制作滑动菜单项效果实现步骤及代码
2013/02/07 Javascript
鼠标划过实现延迟加载并隐藏层的js代码
2013/10/11 Javascript
wap浏览自动跳转到wap页面的js代码
2014/05/17 Javascript
JavaScript中的函数模式详解
2015/02/11 Javascript
JQuery中$.each 和$(selector).each()的区别详解
2015/03/13 Javascript
JS拖动鼠标画出方框实现鼠标选区的方法
2015/08/05 Javascript
浅谈JavaScript中的对象及Promise对象的实现
2015/11/15 Javascript
使用jquery获取url以及jquery获取url参数的实现方法
2016/05/25 Javascript
浅谈Vue SPA 首屏加载优化实践
2017/12/15 Javascript
bootstrap fileinput插件实现预览上传照片功能
2018/01/23 Javascript
详解vue中组件参数
2018/07/09 Javascript
bootstrap table.js动态填充单元格数据的多种方法
2019/07/18 Javascript
vue中uni-app 实现小程序登录注册功能
2019/10/12 Javascript
JS异步宏队列微队列原理详解
2020/09/09 Javascript
关于vue 项目中浏览器跨域的配置问题
2020/11/10 Javascript
简单的Python的curses库使用教程
2015/04/11 Python
python模拟Django框架实例
2016/05/17 Python
Python实现在线音乐播放器
2017/03/03 Python
python 检查文件mime类型的方法
2018/12/08 Python
python使用pdfminer解析pdf文件的方法示例
2018/12/20 Python
python http基本验证方法
2018/12/26 Python
Django实现微信小程序的登录验证功能并维护登录态
2019/07/04 Python
Django用数据库表反向生成models类知识点详解
2020/03/25 Python
Selenium元素定位的30种方式(史上最全)
2020/05/11 Python
python利用xlsxwriter模块 操作 Excel
2020/10/14 Python
css3实现可滑动跳转的分页插件示例
2014/05/08 HTML / CSS
匡威帆布鞋美国官网:Converse美国
2016/08/22 全球购物
慕尼黑山地运动、户外服装和体育用品专家:Sporthaus Schuster
2019/08/27 全球购物
设置器与访问器的定义以及各自特点
2016/01/08 面试题
厕所文明标语
2014/06/11 职场文书
励志演讲稿200字
2014/08/21 职场文书
Shell中的单中括号和双中括号的用法详解
2022/12/24 Servers