【设计模式】【结构型模式】适配器模式

结构型设计模式处理一个系统中不同实体(如类和对象)之间的关系,关注的是提供一种简单的对象组合方式来创造新功能

适配器模式(Adapter pattern)是一种结构型设计模式,帮助我们实现两个不兼容接口之间的兼容。首先,解释一下不兼容接口的真正含义。如果我们希望把一个老组件用于一个新的系统中,或者把一个新的组件用于一个老的系统中,不对代码进行任何修改两者就能通信的情况很少见。但又并非总是能修改代码,或因为我们无法访问这些代码(例如,组件以外部库的方式提供),或因为修改代码本身就不切实际。在这些情况下,我们可以编写一个额外的代码层,该代码层包含让两个接口之间能够通信需要进行的所有修改。这个代码层就叫适配器。

在某个产品造出来后,需要应对新的需求之时,如果希望其仍然有效,则可以使用适配器模式。通常两个不兼容接口中的一个是他方的或者是老旧的。如果是他方的,就意味着我们无法访问其源代码。如果是老旧的,那么对其重构通常是不切实际的。更进一步,我们可以说修改一个老旧组件的实现以满足我们的需求,不仅是不切实际的,而且也违反了开放/封闭原则。本质上这意味着我们应该无需修改一个软件实体的源代码就能扩展其行为。适配器模式遵从开放/封闭原则。
因此,在某个产品制造出来之后,需要应对新的需求之时,如果希望其仍然有效,使用适配器是一种更好的方式。原因为,不要求访问他方的源代码,不违背开放/封闭原则。

实现

# /usr/bin/python
# coding:utf-8

# 我们有什么
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(obj.__dict__)
        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(), 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

  • synth.play与synth.play()的区别
  • obj.dict 里是实例的属性,不包含方法。类的dict里包含。
  • str只能返回string

PS

因为一本书,爱上设计模式。棒~!

你可能感兴趣的:(【设计模式】【结构型模式】适配器模式)