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字典键值对的添加和遍历方法
Sep 11 Python
Python切片操作实例分析
Mar 16 Python
opencv python 傅里叶变换的使用
Jul 21 Python
python IDLE 背景以及字体大小的修改方法
Jul 12 Python
Python PyQt5 Pycharm 环境搭建及配置详解(图文教程)
Jul 16 Python
python中sklearn的pipeline模块实例详解
May 21 Python
Python中的None与 NULL(即空字符)的区别详解
Sep 24 Python
Python爬虫自动化获取华图和粉笔网站的错题(推荐)
Jan 08 Python
python软件测试Jmeter性能测试JDBC Request(结合数据库)的使用详解
Jan 26 Python
pytorch 运行一段时间后出现GPU OOM的问题
Jun 02 Python
Python中OpenCV实现查找轮廓的实例
Jun 08 Python
python疲劳驾驶困倦低头检测功能的实现
Apr 04 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
跟我学Laravel之安装Laravel
2014/10/15 PHP
Thinkphp单字母函数使用指南
2016/05/08 PHP
php实现的简单中文验证码功能示例
2017/01/03 PHP
使用php实现网站验证码功能【推荐】
2017/02/09 PHP
PHP 实现页面静态化的几种方法
2017/07/23 PHP
基于swoole实现多人聊天室
2018/06/14 PHP
读jQuery之十三 添加事件和删除事件的核心方法
2011/08/23 Javascript
JavaScript实现QueryString获取GET参数的方法
2013/07/02 Javascript
原生js编写2048小游戏
2017/03/17 Javascript
微信网页登录逻辑与实现方法
2019/04/29 Javascript
js中的深浅拷贝问题简析
2019/05/10 Javascript
JavaScript 空间坐标的使用
2020/08/19 Javascript
微信小程序实现底部弹出模态框
2020/11/18 Javascript
python常规方法实现数组的全排列
2015/03/17 Python
python读取excel表格生成erlang数据
2017/08/26 Python
python+matplotlib绘制简单的海豚(顶点和节点的操作)
2018/01/02 Python
浅谈python多进程共享变量Value的使用tips
2019/07/16 Python
Python中变量的输入输出实例代码详解
2019/07/28 Python
Python编程快速上手——疯狂填词程序实现方法分析
2020/02/29 Python
keras多显卡训练方式
2020/06/10 Python
python定义类的简单用法
2020/07/24 Python
python 生成正态分布数据,并绘图和解析
2020/12/21 Python
韩国三大免税店之一:THE GRAND 中文免税店
2016/07/21 全球购物
Vision Directa智利眼镜网:框架眼镜、隐形眼镜和名牌太阳眼镜
2016/11/23 全球购物
美国首屈一指的礼品篮供应商:GiftTree
2018/01/06 全球购物
波兰运动鞋网上商店:e-Sporting
2018/02/16 全球购物
电子商务专业毕业生求职信
2014/06/12 职场文书
2014年幼儿园保育工作总结
2014/12/02 职场文书
财务人员岗位职责
2015/02/03 职场文书
婚宴主持词
2015/06/30 职场文书
英语投诉信范文
2015/07/03 职场文书
员工旷工检讨书
2015/08/15 职场文书
《狼牙山五壮士》教学反思
2016/02/17 职场文书
Python爬虫基础之爬虫的分类知识总结
2021/05/13 Python
Python Matplotlib绘制条形图的全过程
2021/10/24 Python
Docker安装MySql8并远程访问的实现
2022/07/07 Servers