动机(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()))
类Adapter
中self.__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
网友评论