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解析XML的几种常见方法的介绍
Apr 09 Python
举例讲解Python设计模式编程中的访问者与观察者模式
Jan 26 Python
深入解析Python中的list列表及其切片和迭代操作
Mar 13 Python
python的mysqldb安装步骤详解
Aug 14 Python
Python2与python3中 for 循环语句基础与实例分析
Nov 20 Python
用python处理图片实现图像中的像素访问
May 04 Python
Python常用模块sys,os,time,random功能与用法实例分析
Jan 07 Python
在 Pycharm 安装使用black的方法详解
Apr 02 Python
python网络编程:socketserver的基本使用方法实例分析
Apr 09 Python
python实现数字炸弹游戏程序
Jul 17 Python
如何基于Django实现上下文章跳转
Sep 16 Python
利用Pycharm + Django搭建一个简单Python Web项目的步骤
Oct 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数组排序usort、uksort与sort函数用法
2014/11/17 PHP
详解WordPress开发中的get_post与get_posts函数使用
2016/01/04 PHP
PHP实现根据时间戳获取周几的方法
2016/02/26 PHP
PHP使用zlib扩展实现GZIP压缩输出的方法详解
2018/04/09 PHP
discuz论坛更换域名,详细文件修改步骤
2020/12/09 PHP
JAVASCRIPT 对象的创建与使用
2021/03/09 Javascript
js文件缓存之版本管理详解
2013/07/05 Javascript
javascript写的异步加载js文件函数(支持数组传参)
2014/06/07 Javascript
javascript跨域方法、原理以及出现问题解决方法(详解)
2015/08/06 Javascript
JS前端笔试题分析
2016/12/19 Javascript
基于jQuery实现照片墙自动播放特效
2017/01/12 Javascript
angularJS模态框$modal实例代码
2017/05/27 Javascript
解决ztree搜索中多级菜单展示不全问题
2017/07/05 Javascript
linux 后台运行node服务指令方法
2018/05/23 Javascript
vue init webpack 建vue项目报错的解决方法
2018/09/29 Javascript
vue服务端渲染操作简单入门实例分析
2019/08/28 Javascript
Python实现将一个正整数分解质因数的方法分析
2017/12/14 Python
Python抓取聚划算商品分析页面获取商品信息并以XML格式保存到本地
2018/02/23 Python
python操作excel让工作自动化
2019/08/09 Python
pytorch构建多模型实例
2020/01/15 Python
基于Python实现2种反转链表方法代码实例
2020/07/06 Python
Python爬虫与反爬虫大战
2020/07/30 Python
如何解决flask修改静态资源后缓存文件不能及时更改问题
2020/08/02 Python
Python实现粒子群算法的示例
2021/02/14 Python
台湾最大银发乐活百货:乐龄网
2018/05/21 全球购物
HomeAway英国:全球领先的度假租赁在线市场
2020/02/03 全球购物
"引用"与多态的关系
2013/02/01 面试题
自考生毕业自我鉴定
2013/10/10 职场文书
导游的职业规划书范文
2013/12/27 职场文书
物流毕业生个人的自我评价
2014/02/13 职场文书
黄金搭档广告词
2014/03/21 职场文书
拉歌口号大全
2014/06/13 职场文书
中职班主任培训心得体会
2016/01/07 职场文书
Python初学者必备的文件读写指南
2021/06/23 Python
html中相对位置与绝对位置的具体使用
2022/05/15 HTML / CSS
Mysql数据库group by原理详解
2022/07/07 MySQL