Python适配器模式代码实现解析
2019-08-02 14:47
1326 查看
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代码实现——(三)适配器模式(Adapter)
- Python实现XML文件解析的示例代码
- 研磨设计模式解析及python代码实现——(一)简单工厂模式
- python实现的解析crontab配置文件代码
- python实现的解析crontab配置文件代码
- Python 实现线形回归解析解公式 代码
- 研磨设计模式解析及python代码实现——(二)外观模式(Facade)
- MAPM代码:任意有效位数的除法实现解析
- Python使用Socket(Https)Post登录百度的实现代码
- 接口模式 - 1.1 适配器模式 --代码实现(C#)
- 快速傅里叶变换(FFT)的原理、实现及代码解析(附C#源码)
- 400多行Python代码实现了一个FTP服务器
- Python边学边用--BT客户端实现之BitTorrent文件解析
- Python 文件操作实现代码
- j2ME中 lwuit实现按钮缩放功能代码解析
- 天气预报抓取、解析(传递抓取的info参数)功能模块实现(代码)
- 使用 Python 模块 re 实现解析小工具
- 用python实现批量重命名文件的代码
- 利用python的xmllib2实现XML文件解析
- Python实现灵活的xml文件解析