我对观察者模式的理解,之前一直很乱
我對觀察者模式的理解
觀察者模式
觀察者模式簡單理解就是,有一方有新動作,另一方也會跟著響應作出改變,比如你點擊了一個關閉按鈕,跟關閉按鈕相關的窗體或者是頁面或者其他東西會有響應,比如窗體關閉了,頁面關閉了。觀察者模式就是建立這個按鈕跟這個窗體進行聯系的方法。觀察者模式也可以稱為發布--訂閱模式,在發布、訂閱模式里,發布方是被觀察者,訂約方是觀察者。有的資料也把被觀察者稱作subject(主題)。以下是錯誤理解!!!
以前我很容易混淆的概念就是,觀察者是干什么的,按照現實中的理解,他不是主動去觀察別人嗎,比如小明是觀察者,小明去觀察正在學騎車的兒子,小明觀察到他兒子做的不對,就通知他兒子該怎么做,然后小明兒子對小明的通知做出響應。
放到發布–訂閱模式里就是:發布方去觀察訂閱方,這里的觀察只是為了要通知訂閱方,A,B,C向發布方訂閱,于是發布方觀察了A,B,C,發布方一旦有新的材料發布,發布方就通知他們,然后訂閱方們收到通知后就做出相關響應。也就是說,發布方是觀察者,訂閱方是被觀察者。
正確思路剛好相反
發布方是被觀察者,訂閱方是觀察者,被觀察者要干嘛呢,觀察者又要干嘛呢,他們是如何聯系起來的呢,也就是說如何“發送”通知呢,讓響應發生呢?
被觀察者要干嘛:
1.添加觀察者,不是觀察者主動去觀察被觀察者,是被觀察者想要被那位觀察者觀察,然后就讓誰觀察,用發布訂閱的模式說,就是發布方想讓哪幾個訂閱方訂閱,就讓哪幾個訂閱方訂閱,被觀察者維護一個觀察者數組,數組里面裝著他的觀察者們,比如發布方維護一個訂閱方數組,【小甲,小乙,小丁】,就是這三人向發布方訂閱了,現在小丙也想訂閱,于是發布方調用 他的方法把小丙添加到數組里,發布方.add(小丙),現在發布方就有四個訂閱者了,就是【小甲,小乙,小丁,小丙】。
2.通知觀察者,把他維護的數組里的訂閱者一個個全都通知。
觀察者要干嘛:
觀察者一般情況下啥也不用干,他有一個響應方法(雖然被稱作觀察者,但他什么也不用觀察,這里的觀察頂多是指讓被觀察者把自己放到被觀察者的數組里,之前我還以為他必須時時刻刻觀察被觀察者呢。。),就等著被通知,被通知后執行自己的響應方法。
如何通知讓被觀察者與觀察者聯系起來,如何通知以及響應:
其實就是被觀察者發生了某事后,去調用觀察者的方法,“調用”就把通知跟響應兩個過程一起包辦了,我調用你就是我通知你,調用你的響應方法就是你的響應。比如
被觀察者.doSomething() {
xxx
xxx
觀察者.自己的方法();
}
總結
以上是生活随笔為你收集整理的我对观察者模式的理解,之前一直很乱的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Jmeter分布式压测方案
- 下一篇: c/c++中extern的作用