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备份文件的脚本
Aug 11 Python
python有证书的加密解密实现方法
Nov 19 Python
Python编程之event对象的用法实例分析
Mar 23 Python
python验证码识别的示例代码
Sep 21 Python
Python建立Map写Excel表实例解析
Jan 17 Python
python自带tkinter库实现棋盘覆盖图形界面
Jul 17 Python
Keras—embedding嵌入层的用法详解
Jun 10 Python
Python pandas对excel的操作实现示例
Jul 21 Python
python实现梯度下降算法的实例详解
Aug 17 Python
详解Python模块化编程与装饰器
Jan 16 Python
详解Java中一维、二维数组在内存中的结构
Feb 11 Python
OpenCV中resize函数插值算法的实现过程(五种)
Jun 05 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
实现“上一页”和“下一页按钮
2006/10/09 PHP
php数据结构与算法(PHP描述) 查找与二分法查找
2012/06/21 PHP
php 检查电子邮件函数(自写)
2014/01/16 PHP
PHP防止刷新重复提交页面的示例代码
2015/11/11 PHP
laravel框架select2多选插件初始化默认选中项操作示例
2020/02/18 PHP
基于JQuery实现异步刷新的代码(转载)
2011/03/29 Javascript
Web跨浏览器进程通信(Web跨域)
2013/04/17 Javascript
基于jQuery实现图片的前进与后退功能
2013/04/24 Javascript
js判断输入是否为数字的具体实例
2013/08/03 Javascript
使用jQuery插件创建常规模态窗口登陆效果
2013/08/23 Javascript
用js+iframe形成页面的一种遮罩效果的具体实现
2013/12/31 Javascript
jQuery的中 is(':visible') 解析及用法(必看)
2017/02/12 Javascript
js实现适配不同的屏幕大小
2017/04/10 Javascript
微信小程序开发之选项卡(窗口底部TabBar)页面切换
2017/04/12 Javascript
jQuery树插件zTree使用方法详解
2017/05/02 jQuery
深入理解Vue.js源码之事件机制
2017/09/27 Javascript
angular中ui calendar的一些使用心得(推荐)
2017/11/03 Javascript
创建Vue项目以及引入Iview的方法示例
2018/12/03 Javascript
layer 刷新某个页面的实现方法
2019/09/05 Javascript
JS Thunk 函数的含义和用法实例总结
2020/04/08 Javascript
解决vscode进行vue格式化,会自动补分号和双引号的问题
2020/10/26 Javascript
数据清洗--DataFrame中的空值处理方法
2018/07/03 Python
对Python3使运行暂停的方法详解
2019/02/18 Python
详解python之heapq模块及排序操作
2019/04/04 Python
使用virtualenv创建Python环境及PyQT5环境配置的方法
2019/09/10 Python
Python3如何判断三角形的类型
2020/04/12 Python
python初步实现word2vec操作
2020/06/09 Python
python爬虫多次请求超时的几种重试方法(6种)
2020/12/01 Python
香港卓悦化妆品官网:BONJOUR
2017/09/21 全球购物
2014年党员承诺书范文
2014/05/20 职场文书
高职教师先进事迹材料
2014/08/24 职场文书
2014年安全工作总结范文
2014/11/13 职场文书
2015年党员自我剖析材料
2014/12/17 职场文书
经典爱情感言
2015/08/03 职场文书
MySQL 视图(View)原理解析
2021/05/19 MySQL
linux目录管理方法介绍
2022/06/01 Servers