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中的Numpy入门教程
Apr 26 Python
Python实现的二维码生成小软件
Jul 11 Python
Python list操作用法总结
Nov 10 Python
Python数据类型详解(一)字符串
May 08 Python
Python自定义线程类简单示例
Mar 23 Python
对python 数据处理中的LabelEncoder 和 OneHotEncoder详解
Jul 11 Python
对Python3 goto 语句的使用方法详解
Feb 16 Python
Python时间序列处理之ARIMA模型的使用讲解
Apr 02 Python
Django在pycharm下修改默认启动端口的方法
Jul 26 Python
python+tkinter实现学生管理系统
Aug 20 Python
Softmax函数原理及Python实现过程解析
May 22 Python
解决运行django程序出错问题 'str'object has no attribute'_meta'
Jul 15 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
Apache+php+mysql在windows下的安装与配置图解(最新版)
2008/11/30 PHP
PHP下利用header()函数设置浏览器缓存的代码
2010/09/01 PHP
关于二级目录拖拽排序的实现(源码示例下载)
2013/04/26 PHP
PHP 7.0新增加的特性介绍
2017/06/08 PHP
浅谈Laravel中的一个后期静态绑定
2017/08/11 PHP
Thinkphp5.0 框架使用模型Model添加、更新、删除数据操作详解
2019/10/11 PHP
基于mootools 1.3框架下的图片滑动效果代码
2011/04/22 Javascript
JavaScript中访问节点对象的方法有哪些如何使用
2013/09/24 Javascript
js(JavaScript)实现TAB标签切换效果的简单实例
2014/02/26 Javascript
jquery带下拉菜单和焦点图代码分享
2015/08/24 Javascript
Nodejs获取网络数据并生成Excel表格
2020/03/31 NodeJs
js 连续赋值的简单实现
2016/06/13 Javascript
zepto与jquery的区别及zepto的不同使用8条小结
2016/07/28 Javascript
AngularJS表单和输入验证实例
2016/11/02 Javascript
纯js仿淘宝京东商品放大镜功能
2017/03/02 Javascript
JS实现基于Sketch.js模拟成群游动的蝌蚪运动动画效果【附demo源码下载】
2017/08/18 Javascript
JavaScript设计模式之调停者模式实例详解
2018/02/03 Javascript
NVM安装nodejs的方法实用步骤
2019/01/16 NodeJs
vue3.0 自适应不同分辨率电脑的操作
2021/02/06 Vue.js
在Python的Django框架中simple-todo工具的简单使用
2015/05/30 Python
python生成随机密码或随机字符串的方法
2015/07/03 Python
python批量提取word内信息
2015/08/09 Python
python中类变量与成员变量的使用注意点总结
2017/04/29 Python
Python内建函数之raw_input()与input()代码解析
2017/10/26 Python
Python3 使用map()批量的转换数据类型,如str转float的实现
2019/11/29 Python
python 操作excel表格的方法
2020/12/05 Python
amazeui 验证按钮扩展的实现
2020/08/21 HTML / CSS
中邮全球便购:中国邮政速递物流
2017/03/04 全球购物
加拿大约会网站:EliteSingles.ca
2018/01/12 全球购物
C++:memset ,memcpy和strcpy的根本区别
2013/04/27 面试题
简历中求职的个人自我评价
2013/12/03 职场文书
优秀党员主要事迹
2014/01/19 职场文书
法律专业求职信
2014/05/24 职场文书
经典团队口号大全
2014/06/21 职场文书
法律专业大学生职业生涯规划书:向目标一步步迈进
2014/09/22 职场文书
合作协议书格式范本
2016/03/21 职场文书