python适配器模式角色_python设计模式-适配器模式
適配器模式主要解決的問題保留舊版本的接口的基礎上,新開發的接口能夠兼容到舊版本的系統上。其實我們重構舊版本的代碼也可以實現相應功能的開發,但是這就違背的了開放與封閉原則,因此我們不會輕易去修改舊代碼,除非你要重構舊版本的代碼,都是通過增量式開發,同時兼容舊版本。
設計模式這東西只有在你要優化當前系統的時候才會使用到,不可能一開始全部的系統都是以設計模式的思維來維護,這樣的情況下這個系統得多久才能完成。
下面舉個例子來直白的了解一下適配器模式:
在這里舊版本功能就是電腦執行一個程序,新功能就是要保證其舊版本功能的基礎上加入播放音樂等功能。
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__達到成員屬性變量的賦值。
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的python适配器模式角色_python设计模式-适配器模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我国首次在港澳选拔航天载荷专家,香港地区
- 下一篇: 《交管12123》账号删除方法-交管12