美文网首页
设计模式(python实现)--适配器模式(Adapter)

设计模式(python实现)--适配器模式(Adapter)

作者: 远行_2a22 | 来源:发表于2020-01-26 22:08 被阅读0次

    动机(Motivation)

    • 由于应用环境的变化,常常需要将”一些现存的对象“放在新的环境中应用,但是新环境要求的接口是这些现存对象所不满足。
    • 如何应对这些”迁移的变化“?
    • 在某个产品制造出来之后,需要应对新的需求之时,如果希望其仍然有效,则可以使用适配 器模式。通常两个不兼容接口中的一个是他方的或者是老旧的。 如果一个接口是他方的,就意味着我们无法访问其源代码。如果是老旧的,那么对其重构通常是 不切实际的。

    模式定义

    将一个类的接口转换成客户希望的另一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
    ——《设计模式》GoF

    要点总结

    • 在遗留代码复用、类库迁移等方面有用

    UML

    例子

    例子中多个类有功能类似的接口,当想要用一个接口统一访问,而又无法或者很难修改源码的时候,可以使用适配器模式。

    # -*- coding:utf-8 -*-
    
    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 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 Adapter:
    
        def __init__(self, obj, adapted_methods):
            self.obj = obj
            self.__dict__.update(adapted_methods)
            print ("self.__dict__:", self.__dict__)
    
        def __str__(self):
            return str(self.obj)
    
    
    if __name__ == '__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()))
    

    Adapterself.__dict__.update(adapted_methods),其实相当于

    class Adapter:
        def __init__(self, obj, adapted_methods):
            self.obj = obj
            self.execute = adapted_methods
    
    if __name__ == '__main__':
      objects.append(Adapter(synth, synth.play))
    

    self.__dict__详细用法可以参考python中的dict

    相关文章

      网友评论

          本文标题:设计模式(python实现)--适配器模式(Adapter)

          本文链接:https://www.haomeiwen.com/subject/sjpjthtx.html