定義
定義了對(duì)象之間的一對(duì)多依賴,這樣一來,當(dāng)一個(gè)對(duì)象改變狀態(tài)時(shí),他的所有依賴者都會(huì)收到通知并自動(dòng)更新.
模式特點(diǎn)
- 觀察者模式定義了對(duì)象間
一對(duì)多
的關(guān)系. -
主題
可以通過一個(gè)接口來更新觀察者. - 觀察者和可觀察者之間通過
松耦合
的方式結(jié)合,可觀察者不知道觀察者的實(shí)現(xiàn)細(xì)節(jié),只知道觀察者實(shí)現(xiàn)了相應(yīng)的接口. - 有多個(gè)觀察者時(shí),不可以依賴特定的通知
順序
,這個(gè)順序和語言自身的實(shí)現(xiàn)有關(guān). - 當(dāng)觀察者取消
訂閱
時(shí),他將不再收到主題發(fā)出的消息.
個(gè)人理解
看完立刻讓我聯(lián)想到了OC
中的KVO
和通知
,仔細(xì)想了想他們確實(shí)都滿足上面的特點(diǎn),一對(duì)多
,松耦合
,改變后能夠傳遞消息
.那再仔細(xì)想一想,協(xié)議
和block
算嗎?寫起來吧,對(duì)他們進(jìn)行改造其實(shí)也能夠?qū)崿F(xiàn),但是這本身其實(shí)沒什么意義,因?yàn)?code>OC提供給我們的這兩種常用的方式其實(shí)已經(jīng)算是很不錯(cuò)的一種方式了,這里不會(huì)對(duì)KVO
和通知
如何去使用做過多的闡述.
一直在接觸的RAC
這種框架其實(shí)在我看來也是蠻像的,但他有個(gè)優(yōu)點(diǎn),我們可以在主題
方先行結(jié)束訂閱,也可以在訂閱者
方提前結(jié)束,并且通過函數(shù)式
的優(yōu)點(diǎn),我們可以在時(shí)間
和空間上
對(duì)信號(hào)進(jìn)行控制,比如節(jié)流
和忽略相關(guān)信息
,這其實(shí)在我看來都是一定程度上在觀察者模式
方向上的一定優(yōu)化和擴(kuò)展.
書中還擴(kuò)展了我們的觀察者不應(yīng)僅僅只是被動(dòng)
地接收主題
發(fā)送的信息,還可以主動(dòng)
的去拉取,寫法大概上相當(dāng)于聲明一個(gè)BOOL
值,當(dāng)要觀察的對(duì)象(OC中可以通過set
方法觸發(fā)),當(dāng)我們主動(dòng)去拉取的時(shí)候,改變這個(gè)BOOL
值此時(shí)才可以讓通知
或者KVO
發(fā)憷值,發(fā)出完再去更改這個(gè)BOOL
值,這樣只有我們每次去拉取的時(shí)候他才會(huì)發(fā)送一次.
觀察者模式在OC
中的個(gè)人猜測實(shí)現(xiàn)
- 1 主題中應(yīng)該有一個(gè)
數(shù)組
來存儲(chǔ)自己所需要通知的對(duì)象,觀察者
通過訂閱
主題來將自己添加到主題
的數(shù)組中. - 2 當(dāng)需要通知時(shí),
主題
會(huì)遍歷
這個(gè)數(shù)組
,給每一個(gè)對(duì)象發(fā)送消息. - 3取消訂閱時(shí),
主題
將觀察者
從數(shù)組中移除,以后就不會(huì)再發(fā)送了. - 4
觀察者
被銷毀
的時(shí)候,一定要取消訂閱
,否則當(dāng)主題
再次發(fā)送消息時(shí),會(huì)因?yàn)?code>觀察者已經(jīng)不在了而導(dǎo)致crash
,這里調(diào)試起來還相當(dāng)?shù)睦щy,希望各位養(yǎng)成習(xí)慣吧(ps:一般老手這都是習(xí)慣了)