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实现的文件夹清理程序分享
Nov 22 Python
python脚本内运行linux命令的方法
Jul 02 Python
教你学会使用Python正则表达式
Sep 07 Python
Python cookbook(数据结构与算法)将名称映射到序列元素中的方法
Mar 22 Python
用PyInstaller把Python代码打包成单个独立的exe可执行文件
May 26 Python
Pandas之Dropna滤除缺失数据的实现方法
Jun 25 Python
django多文件上传,form提交,多对多外键保存的实例
Aug 06 Python
python写入数据到csv或xlsx文件的3种方法
Aug 23 Python
pycharm设置python文件模板信息过程图解
Mar 10 Python
pytorch VGG11识别cifar10数据集(训练+预测单张输入图片操作)
Jun 24 Python
python Matplotlib模块的使用
Sep 16 Python
python tkinter Entry控件的焦点移动操作
May 22 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记录用户通过搜索引擎进网站的关键词
2014/02/13 PHP
PHP过滤黑名单关键字的方法
2014/12/01 PHP
php中adodbzip类实例
2014/12/08 PHP
PHP设计模式之工厂模式与单例模式
2016/09/28 PHP
php redis实现对200w用户的即时推送
2017/03/04 PHP
基于thinkphp6.0的success、error实现方法
2019/11/05 PHP
PHP实现随机发放扑克牌
2020/04/21 PHP
5个最佳的Javascript日期处理类库分享
2012/04/15 Javascript
jQuery中delegate与on的用法与区别示例介绍
2013/12/20 Javascript
原生JS绑定滑轮滚动事件兼容常见浏览器
2014/06/30 Javascript
Node.js的特点和应用场景介绍
2014/11/04 Javascript
javascript批量修改文件编码格式的方法
2015/01/27 Javascript
jQuery实现的五子棋游戏实例
2015/06/13 Javascript
AngularJS基于ui-route实现深层路由的方法【路由嵌套】
2016/12/14 Javascript
jQuery.cookie.js实现记录最近浏览过的商品功能示例
2017/01/23 Javascript
详解Vue的watch中的immediate与watch是什么意思
2019/12/30 Javascript
JavaScript实现密码强度实时验证
2020/03/18 Javascript
[01:35]2018年度CS GO最佳战队-完美盛典
2018/12/17 DOTA
python通过urllib2爬网页上种子下载示例
2014/02/24 Python
Python中实现结构相似的函数调用方法
2015/03/10 Python
基础的十进制按位运算总结与在Python中的计算示例
2016/06/28 Python
Python中的heapq模块源码详析
2019/01/08 Python
python去除删除数据中\u0000\u0001等unicode字符串的代码
2020/03/06 Python
基于python实现地址和经纬度转换
2020/05/19 Python
python两个list[]相加的实现方法
2020/09/23 Python
最畅销的视频游戏享受高达90%的折扣:CDKeys
2020/02/10 全球购物
Urban Decay官方网站:美国化妆品品牌
2020/06/04 全球购物
父亲追悼会答谢词
2014/01/17 职场文书
小学数学教学反思
2014/02/02 职场文书
舞蹈专业大学生职业规划范文
2014/03/12 职场文书
大学中国梦演讲稿
2014/04/23 职场文书
班组拓展活动方案
2014/08/14 职场文书
祝寿主持词
2015/07/02 职场文书
分析mysql中一条SQL查询语句是如何执行的
2021/06/21 MySQL
Apache Pulsar集群搭建部署详细过程
2022/02/12 Servers
Python echarts实现数据可视化实例详解
2022/03/03 Python