共计 1445 个字符,预计需要花费 4 分钟才能阅读完成。
适配器模式主要解决的问题保留旧版本的接口的基础上,新开发的接口能够兼容到旧版本的系统上。其实我们重构旧版本的代码也可以实现相应功能的开发,但是这就违背的了开放与封闭原则,因此我们不会轻易去修改旧代码,除非你要重构旧版本的代码,都是通过增量式开发,同时兼容旧版本。
设计模式这东西只有在你要优化当前系统的时候才会使用到,不可能一开始全部的系统都是以设计模式的思维来维护,这样的情况下这个系统得多久才能完成。
下面举个例子来直白的了解一下适配器模式:
在这里旧版本功能就是电脑执行一个程序,新功能就是要保证其旧版本功能的基础上加入播放音乐等功能。
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)
#self.__dict__['name']=obj.name
def __str__(self):
return str(self.obj)
运行代码
from chapter4 import adapter,external_1
def main():
objects = [adapter.Computer('Asus')]
synth = external_1.Synthesizer('moog')
objects.append(adapter.Adapter(synth, dict(execute=synth.play)))
human = external_1.Human('Bob')
objects.append(adapter.Adapter(human, dict(execute=human.speak)))
for i in objects:
print('{} {}'.format(str(i), i.name))
main()
这个是从设计模式书上摘抄过来的,书上留的一个问题是,现在Synthesizer,Human和Computer都具有相同的成员变量name,问如何修改适配器输出name
我在上面的适配器中注释部分即提供了解决方法,直接修改适配器中的__dict__成员,本来一开始想是用过重载__getattr__函数来实现属性的访问,但是你要注意到Computer类是没有对饮的obj变量的,所以你还是报错,这样是行不通的,所以最后还是修改__dict__达到成员属性变量的赋值。
正文完
请博主喝杯咖啡吧!