Python适配器模式

来源:互联网 发布:零售软件是什么 编辑:程序博客网 时间:2024/05/21 07:56

适配器模式(Adapter Pattern)

  • 通常情况下,原系统的代码要么无法获取——如库等、要么难以冒险重构——如运行5年以上的老旧系统牵一发而动全身。在设计中使用适配器模式,可以保证在不修改原系统代码的前提下,实现新需求与原系统的对接。
  • 适配器模式是一种结构型设计模式,实现两个不兼容接口之间的兼容。以保证程序符合开放/封闭原则,保持新老代码间的兼容性。
  • 结构型设计模式处理一个系统中不同实体(类和对象)之间的关系,关注的是提供一种简单的对象组合方法来创造新功能。

假设场景

存在一套旧系统,里面包含 HumanSynthesizer 类,如下:

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()))
原创粉丝点击