亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > 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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲性日韩精品一区二区| 欧美最近摘花xxxx摘花| 欧美在线一区二区视频| 一个色综合导航| 成人av番号网| 国产精品一区二区久久国产| 国产欧美一区二区三区视频| 国产精品免费一区二区三区都可以| 欧美在线亚洲一区| 国产日韩在线精品av| 欧美激情中文字幕在线| 91国产精品电影| 国产精品免费小视频| 日本道色综合久久影院| 精品国产视频在线| 日本道色综合久久影院| 日韩在线精品视频| 日韩美女视频在线观看| 97涩涩爰在线观看亚洲| 国产欧美精品在线播放| 欧美区在线播放| 日韩精品极品在线观看| 国产精品国模在线| 亚洲成人激情小说| 亚洲品质视频自拍网| 国产精品福利观看| 最近2019中文免费高清视频观看www99| 亚洲一区中文字幕在线观看| 91精品在线影院| 国产精品九九久久久久久久| 亚洲色图国产精品| 中文字幕亚洲欧美| 欧美激情一区二区三区在线视频观看| 国产精品久久久久久久久久久久久久| 亚洲天堂视频在线观看| 69久久夜色精品国产7777| 精品亚洲国产成av人片传媒| 欧美午夜性色大片在线观看| 97在线精品国自产拍中文| 欧美中文在线观看国产| 欧美大片大片在线播放| 欧美日韩一区二区三区| 日韩av电影在线播放| 国产欧美日韩中文| 欧美在线观看网址综合| 精品国产一区二区三区久久狼5月| 国产欧美日韩丝袜精品一区| 自拍偷拍亚洲区| 久久人人爽人人爽爽久久| 久久久这里只有精品视频| 亚洲福利在线观看| 国产精品三级久久久久久电影| 97精品一区二区视频在线观看| 中文字幕精品在线视频| 一区二区三区国产在线观看| 欧美日韩黄色大片| 成人久久18免费网站图片| 欧美一区二区三区图| 欧美日本国产在线| 久久这里只有精品视频首页| 69影院欧美专区视频| 亚洲精品日韩久久久| 亚洲视频axxx| 国产视频亚洲精品| 日韩暖暖在线视频| 精品成人久久av| 亚洲高清在线观看| 色老头一区二区三区| 久久久精品在线观看| 国产精品一香蕉国产线看观看| 成人午夜激情免费视频| 亚洲美女自拍视频| 亚洲免费福利视频| 91在线中文字幕| 中文字幕日韩欧美在线| 亚洲精品国产suv| 一区二区日韩精品| 久久久国产精彩视频美女艺术照福利| 色香阁99久久精品久久久| 欧美成人一二三| 久久视频在线直播| 亚洲视频一区二区三区| 精品综合久久久久久97| 日韩亚洲欧美成人| 久久午夜a级毛片| 亚洲三级av在线| 国产成人精品a视频一区www| 日韩成人在线视频观看| 精品久久久久久久久久ntr影视| 亚洲视频在线观看视频| 欧美日韩免费网站| 91精品在线影院| 国产玖玖精品视频| 国产精品91久久| 欧美综合国产精品久久丁香| 久久人91精品久久久久久不卡| 欧美日韩在线视频一区| 97碰碰碰免费色视频| 日韩精品一区二区三区第95| 国产精品私拍pans大尺度在线| 亚洲综合中文字幕在线| 亚洲性无码av在线| 国产成一区二区| 精品国偷自产在线| 亚洲电影在线看| 国产精品最新在线观看| 日韩av一区二区在线观看| 亚洲精品美女在线| 欧洲中文字幕国产精品| 日韩在线视频导航| 欧美日韩xxxxx| 精品亚洲精品福利线在观看| 亚洲国产日韩欧美在线动漫| 亚洲视频国产视频| 91精品国产综合久久香蕉的用户体验| 久久国产精品视频| 亚洲偷熟乱区亚洲香蕉av| 国产精品吊钟奶在线| 欧美日韩在线免费观看| 日本成人在线视频网址| 成人黄色免费在线观看| 国产精品白丝av嫩草影院| 亚洲天堂影视av| 日韩精品中文字幕在线观看| 国产精品亚洲自拍| 欧美国产日韩一区二区三区| 亚洲女人天堂成人av在线| 欧亚精品中文字幕| 欧美激情国产日韩精品一区18| 亚洲人精选亚洲人成在线| 国产小视频国产精品| 久久全球大尺度高清视频| 日韩色av导航| 国产精品日韩av| 欧美精品一区二区三区国产精品| 久久久久久亚洲| 色噜噜狠狠狠综合曰曰曰88av| 亚洲男人的天堂在线| 国产精品久久av| 国产精品户外野外| 久久视频在线看| 亚洲福利视频在线| 91精品国产综合久久香蕉的用户体验| 欧美猛交ⅹxxx乱大交视频| 性色av一区二区三区在线观看| 亚洲国产精品字幕| 黄色成人av网| 欧美激情在线播放| 日韩福利伦理影院免费| 国产一区二区三区直播精品电影| 亚洲欧美国产另类| 国产一区二区丝袜高跟鞋图片| 欧美老肥婆性猛交视频| 国产精品色视频| 北条麻妃一区二区三区中文字幕| 久久精品国产v日韩v亚洲| 欧美亚洲视频一区二区| 国产精品亚洲欧美导航| 色综合久久88| 热门国产精品亚洲第一区在线| 国产精品视频区| 黑人巨大精品欧美一区免费视频| 91精品国产色综合| 亚洲国产小视频在线观看|