适配器模式(AdapterPattern)定义了适配器模式,将一个接口转换为客户想要的另一个接口。Adapter将不能协同工作的接口转换成可以协同工作的接口》《大话设计模式》Adapter模式一般应用在源码不能修改的情况下,如果只提供库,需要适配已有的代码,额外加一个layer是必需的Adapter层,个人理解是在两个不完全匹配的接口之间加一层代码,使它们匹配。适配器的目的是保证不违反面向对象编程的开闭原则。UML实例@startumlclassTargetclassClientclassAdapterclassAdapteeTarget<|--AdapterTarget<--ClientAdaptee<--Adapter@endumlAdapter实现了Target方法,客户端最终只访问了目标接口Type,Adapter为了使客户端可访问的Adaptee。Adapter中存在Adaptee类对象代码。在熟练的python设计模式中,适配器模式的引入也相当简单,只要实现目标接口的方法,#externalclassclassSynthesizer:def__init__(self,name):self.name=namedef__str__(self):return'the{}synthesizer'.format(self.name)defplay(self):return'isplayinganelectronicsong'classHuman:def__init__(self,name):self.name=namedef__str__(self):return'{}thehuman'.format(self.name)defspeak(self):return'sayshello'#codeclassAdapter(object):'''这个是适配器类,通过一个简单对象,即将需要适配的目标对象的内容添加到适配器对象中,key:为目标对象的方法,value:为需要适配的方法。并将要适配对象的obj字典内容(保存属性信息等)添加到adapter中,这样属性信息也可以调用'''def__init__(self,obj,adaptermethod):self.obj=objself.__dict__.update(adaptermethod)self.__dict__.update(obj.__dict__)super().__init__()def__str__(self):returnstr(self.obj)fromexternal.externalimportSynthesizer,Human#合成器和Human,都是external外部包的两个类,有自己的paly和speak方法,#但是client只知道Computer的调用方法,也就是execute,所以adapter需要做的是保证执行原代码保持不变。就是这样。类Computer(object):def__init__(self,name):self.name=namedef__str__(self):return'the{}computer'。format(self.name)defexecute(self):return'executesaprogram'defmain():objects=[Computer('Asus')]synth=Synthesizer('moog')#添加适配器类以确保Synthesizer也可以称为objects.append(Adapter(synth,dict(execute=synth.play)))human=Human('Bob')objects.append(Adapter(human,dict(execute=human.speak)))fori在对象中:print('{}{}'.format(str(i),i.execute()))print('name:{}'.format(i.name))if__name__=="__main__":main()知识点重点理解对象的__dict__字典中存储的内容,存储对象的属性信息和方法信息,有兴趣的可以调试看看#输出i.__dict__{'execute'的内容:
