我們知道使用委托的設計模式可以實作一對一的通知關系,但是如果需要通知多個觀察者狀态變化又該如何呢?此時,需要實作觀察者模式之類的内容,而不是實作委托者一對一的模式。
觀察者模式定義了一個對象可以将另一個對象注冊成自身觀察者的模式,對象被注冊成觀察者後,任何觀察者關注者事件都會在其發生時send給觀察者。obj-c中實作觀察者模式是通過nsnotificationcenter類實作的。該類為觀察者對象和事件提供了一個全局排程系統。觀察者可以向其注冊觀測系統中特定的事件;而被觀察對象,在事件發生時,也可以釋出通知到nsnotificationcenter,這樣任何被觀察者對象的通知可以發送到任何觀察者對象,進而達到多對多關系的觀察者模式。
為了完成觀察者模式,一般要完成以下幾個步驟:
1: 觀察者使用nsnotificationcenter執行個體方法-addobserver将自身注冊為特定事件的觀察者;
2: 觀察者要實作步驟1中注冊的回調方法;
3: 被觀察者對象要使用-postnotifiationname之類的發送方法發送消息;
4: 觀察者最終要確定在釋放時使用-removeobserver:将自己從nsnotificationcenter中移除。
下面用杜撰的代碼來看看實際如何實作觀察者模式。代碼中狗仔隊對于明星無聊中的對話可謂是八卦之極,star的每一句話都要設法得到啊。不過從實際代碼看來,貌似明星也有意的想把這些對話内容傳播出去啊!如果不想,那就類似于<<obj-c程式設計17:鍵值觀察>>裡的鍵值觀察模式了哦。下面上代碼:
運作結果是我們可以預料到的:
apple@kissair: objc_src$./9
2014-08-03 21:05:11.830 9[910:507] lucy to say :no shit!
2014-08-03 21:05:11.831 9[910:507] star lucy sayed "no shit!"
2014-08-03 21:05:11.832 9[910:507] jack to say :that's right!
2014-08-03 21:05:11.832 9[910:507] star jack sayed "that's right!"
有人會說了,你這是1對多關系哦。多對多關系也很簡單,狗仔隊不止一隻啊,我們再來建立1個,改變的代碼如下:
運作結果如下:
2014-08-03 21:32:43.513 9[973:507] lucy to say :no shit!
2014-08-03 21:32:43.514 9[973:507] star lucy sayed "no shit!"
2014-08-03 21:32:43.515 9[973:507] star lucy sayed "no shit!"
2014-08-03 21:32:43.515 9[973:507] jack to say :that's right!
2014-08-03 21:32:43.516 9[973:507] star jack sayed "that's right!"