国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

舉例講解Python設計模式編程中的訪問者與觀察者模式

2020-01-04 17:48:19
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了Python設計模式編程中的訪問者與觀察者模式,設計模式的制定有利于團隊協作編程代碼的協調,需要的朋友可以參考下
 

訪問者模式
我覺得Visitor模式是在補修改已有程序結構前提下,通過添加額外的訪問者完成對代碼功能的拓展 為什么這樣用?當你的類層次較多,在某層結構中增加新的方法,要是在基類上面添加或者變更,可能破壞原來的設計, 有兼容問題,所以只在需要的類上面動態添加。

python的例子
這里是個構建車的例子,每個部件都有一個accept的方法接受我上面說的所謂'訪問者',而這個訪問者 以參數的方式傳進來,但是其實他是一個含有一些功能的類的實例,它擁有很多個visit開頭的方法對應不同的部件。 這樣就不需要修改這些部件,而只是修改我們的訪問者類的相關部分。

# 輪子,引擎, 車身這些定義好了都不需要變動class Wheel:  def __init__(self, name):    self.name = name  def accept(self, visitor):    # 每個visitor是同樣的,但是其中的方法是不一樣的,比如這里是visitWheel,    # 然后傳入了self,想想?他其實想做什么就能做什么    visitor.visitWheel(self)class Engine:  def accept(self, visitor):    visitor.visitEngine(self)class Body:  def accept(self, visitor):    visitor.visitBody(self)# 我們要組合成車class Car:  def __init__(self):    self.engine = Engine()    self.body  = Body()    self.wheels = [ Wheel("front left"), Wheel("front right"),            Wheel("back left") , Wheel("back right") ]  # 這個也不需要在動,他只是上面部件的組合,只是做了屬性的委托  def accept(self,visitor):    visitor.visitCar(self)    self.engine.accept(visitor)    self.body.accept(visitor)    for wheel in self.wheels:      wheel.accept(visitor)# 這個才是我們的訪問者,每次的修改都在這里面class PrintVisitor:  def visitWheel(self, wheel):    print "Visiting "+wheel.name+" wheel"  def visitEngine(self, engine):    print "Visiting engine"  def visitBody(self, body):    print "Visiting body"  def visitCar(self, car):    print "Visiting car"if __name__ == '__main__':  car = Car()  visitor = PrintVisitor()  car.accept(visitor)


觀察者模式
當我們希望一個對象的狀態發生變化,那么依賴與它的所有對象都能相應變化(獲得通知),那么就可以用到Observer模式, 其中的這些依賴對象就是觀察者的對象,那個要發生變化的對象就是所謂'觀察者'

python的例子

# 這個是觀察者基類class Subject(object):  def __init__(self):    self._observers = []  # 添加依賴的對象  def attach(self, observer):    if not observer in self._observers:      self._observers.append(observer)  # 取消添加  def detach(self, observer):    try:      self._observers.remove(observer)    except ValueError:      pass  # 這里只是通知上面注冊的依賴對象新的變化  def notify(self, modifier=None):    for observer in self._observers:      # 可以設置過濾條件,對不符合過濾條件的更新      if modifier != observer:        observer.update(self)# 觀察者類class Data(Subject):  def __init__(self, name=''):    super(Data, self).__init__()    self.name = name    self._data = 0  # python2.6新增的寫法,獲取屬性為property,設置屬性為(假設屬性名字為x)@x.setter,刪除為@x.deleter  @property  def data(self):    return self._data  @data.setter  def data(self, value):    self._data = value    self.notify()# 這里有2個被觀察者,也就是依賴的對象,每次Data有改變,這2個view都會變動class HexViewer(object):  def update(self, subject):    print 'HexViewer: Subject %s has data 0x%x' % (subject.name, subject.data)class DecimalViewer(object):  def update(self, subject):    print 'DecimalViewer: Subject %s has data %d' % (subject.name, subject.data)if __name__ == '__main__':  data1 = Data('Data 1')  data2 = Data('Data 2')  view1 = DecimalViewer()  view2 = HexViewer()  data1.attach(view1)  data1.attach(view2)  data2.attach(view2)  data2.attach(view1)  print "Setting Data 1 = 10"  data1.data = 10  print "Setting Data 2 = 15"  data2.data = 15  print "Setting Data 1 = 3"  data1.data = 3  print "Setting Data 2 = 5"  data2.data = 5  print "Update data1's view2 Because view1 is be filtered"  data1.notify(modifier=view1)   print "Detach HexViewer from data1 and data2."  data1.detach(view2)  data2.detach(view2)  print "Setting Data 1 = 10"  data1.data = 10  print "Setting Data 2 = 15"  data2.data = 15

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 双鸭山市| 贡觉县| 旬阳县| 讷河市| 微山县| 怀安县| 乐都县| 江达县| 鸡东县| 江北区| 遂昌县| 霍山县| 湘乡市| 柳林县| 诏安县| 卢湾区| 广水市| 逊克县| 都匀市| 梨树县| 德格县| 三门县| 枝江市| 彭阳县| 山东| 瑞金市| 汕尾市| 绥阳县| 江安县| 张家川| 独山县| 涟源市| 将乐县| 通河县| 广南县| 满城县| 仙居县| 安泽县| 凤城市| 纳雍县| 博罗县|