Python适配器模式
来源:互联网 发布:零售软件是什么 编辑:程序博客网 时间:2024/05/21 07:56
适配器模式(Adapter Pattern)
- 通常情况下,原系统的代码要么无法获取——如库等、要么难以冒险重构——如运行5年以上的老旧系统牵一发而动全身。在设计中使用适配器模式,可以保证在不修改原系统代码的前提下,实现新需求与原系统的对接。
- 适配器模式是一种结构型设计模式,实现两个不兼容接口之间的兼容。以保证程序符合开放/封闭原则,保持新老代码间的兼容性。
- 结构型设计模式处理一个系统中不同实体(类和对象)之间的关系,关注的是提供一种简单的对象组合方法来创造新功能。
假设场景
存在一套旧系统,里面包含 Human
和 Synthesizer
类,如下:
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'
现在新增 Computer
类如下:
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'
有一个问题:客户端仅知道如何调用execute()
方法,并不知道 Synthesizer.play()
和 Human.speak()
。必须像调用 Computer.execute()
一样使用 Synthesizer.execute()
和 Human.execute()
来调用原系统中对象的执行函数。
适配器是救星!我们可以创建一个 Adapter
类专门用于统一接口。__init__()
方法的obj参数是我们想要适配的对象,adapted_methods
是一个字典,键值对中的键是客户端要调用的方法,值是应该被调用的方法。
class Adapter: def __init__(self, obj, adapted_methods): self.obj = obj self.__dict__.update(adapted_methods) def __str__(self): return str(self.obj)
接下来,只需要在调用时,对原有系统的类进行封装,即可实现统一使用 execute()
方法执行动作了。代码如下:
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()))
阅读全文
0 0
- 适配器模式(python)
- 适配器模式(python)
- python 适配器模式
- Python适配器模式
- python 适配器模式
- Python设计模式-适配器模式
- python设计模式(适配器模式)
- Python设计模式--适配器模式
- python设计模式之适配器
- Python设计模式——适配器模式
- Python设计模式(二)【适配器模式】
- 设计模式-适配器模式-adapter-python
- 设计模式十(适配器模式,python语言实现)
- 大话设计模式(Python版)--适配器模式
- Python 的结构型设计模式——适配器模式
- Python的结构型设计模式之适配器模式
- 适配器及适配器模式
- 适配器及适配器模式
- leetcode 515. Find Largest Value in Each Tree Row
- 支持向量机(SVM)常考点
- JSP用到一个下拉框<select> 页面刷新后,保持选中的值
- HTML5的input
- Google、IBM和Lyft开源的微服务管理框架Istio安装文档
- Python适配器模式
- 传统IO与NIO的比较
- 拷贝文件夹到一个新的文件
- Android Studio新功能解析,你真的了解Instant Run吗?
- CSS选择器区别和使用方法
- .dynsym .symtab
- Django 关于manytomany add的问题
- python学习日记(3)
- 新BLOG!!!!