Python适配器模式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/duxu24/article/details/72847523

适配器模式(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()))

猜你喜欢

转载自blog.csdn.net/duxu24/article/details/72847523