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实现Linux下守护进程的编写方法
Aug 22 Python
python中MethodType方法介绍与使用示例
Aug 03 Python
基于python select.select模块通信的实例讲解
Sep 21 Python
python抓取网页中链接的静态图片
Jan 29 Python
Django跨域请求CSRF的方法示例
Nov 11 Python
selenium设置proxy、headers的方法(phantomjs、Chrome、Firefox)
Nov 29 Python
python使用matplotlib画柱状图、散点图
Mar 18 Python
django和vue实现数据交互的方法
Aug 21 Python
python多进程(加入进程池)操作常见案例
Oct 21 Python
opencv resize图片为正方形尺寸的实现方法
Dec 26 Python
Pytorch 图像变换函数集合小结
Feb 01 Python
python中random模块详解
Mar 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
晋城吧对DiscuzX进行的前端优化要点
2010/09/05 PHP
PHP SPL使用方法和他的威力
2013/11/12 PHP
浅谈PHP array_search 和 in_array 函数效率问题
2019/10/15 PHP
PHP pthreads v3下worker和pool的使用方法示例
2020/02/21 PHP
PHP常量DIRECTORY_SEPARATOR原理及用法解析
2020/11/10 PHP
js遍历、动态的添加数据的小例子
2013/06/22 Javascript
jQuery 借助插件Lavalamp实现导航条动态美化效果
2013/09/27 Javascript
jQuery菜单插件用法实例
2015/07/25 Javascript
实例详解JSON数据格式及json格式数据域字符串相互转换
2016/01/07 Javascript
使用base64对图片的二进制进行编码并用ajax进行显示
2017/01/03 Javascript
canvas基础绘制-绚丽倒计时的实例
2017/09/17 Javascript
浅谈Redux中间件的实践
2018/07/27 Javascript
koa router 多文件引入的方法示例
2019/05/22 Javascript
jquery实现聊天机器人
2020/02/08 jQuery
原生js实现弹窗消息动画
2020/11/20 Javascript
python自动化测试之setUp与tearDown实例
2014/09/28 Python
python图书管理系统
2020/04/05 Python
对numpy中轴与维度的理解
2018/04/18 Python
Windows下python3.7安装教程
2018/07/31 Python
Python tkinter的grid布局及Text动态显示方法
2018/10/11 Python
Django--权限Permissions的例子
2019/08/28 Python
python hash每次调用结果不同的原因
2019/11/21 Python
学习Python列表的基础知识汇总
2020/03/10 Python
Python selenium键盘鼠标事件实现过程详解
2020/07/28 Python
css3实现书本翻页效果的示例代码
2021/03/08 HTML / CSS
毕业生的自我评价
2013/12/30 职场文书
小学生打架检讨书
2014/01/26 职场文书
迟到早退检讨书
2014/02/10 职场文书
运动会闭幕式解说词
2014/02/21 职场文书
ktv好的活动方案
2014/08/17 职场文书
教师演讲稿开场白
2014/08/25 职场文书
2014年国庆节活动总结
2014/08/26 职场文书
重温入党誓词主持词
2015/06/29 职场文书
2019大学生预备党员转正思想汇报
2019/06/21 职场文书
Go 实现英尺和米的简单单位换算方式
2021/04/29 Golang
Python上下文管理器Content Manager
2021/06/26 Python