在今天,觀察者模式是出現(xiàn)的最常用的軟件設(shè)計(jì)模式之一。它基于subject這個(gè)概念。subject是一種特殊對(duì)象,當(dāng)它改變時(shí),那些由它保存的一系列對(duì)象將會(huì)得到通知。而這一系列對(duì)象被稱(chēng)作Observers,它們會(huì)對(duì)外暴漏了一個(gè)通知方法,當(dāng)subject狀態(tài)發(fā)生變化時(shí)會(huì)調(diào)用的這個(gè)方法。
在上一章中,我們看到了電子表單的例子?,F(xiàn)在我們可以展開(kāi)這個(gè)例子講,展示一個(gè)更復(fù)雜的場(chǎng)景。讓我們考慮這樣一個(gè)填著賬戶(hù)數(shù)據(jù)的電子表單。我們可以把這些數(shù)據(jù)比作一張表,或者是3D柱狀圖,或者是餅狀圖。它們中每一個(gè)代表的意義都取決于同一組要展示的數(shù)據(jù)。每一個(gè)都是一個(gè)觀察者,都依賴(lài)于那一個(gè)subject,維護(hù)著全部信息。
3D柱狀圖這個(gè)類(lèi)、餅狀圖類(lèi)、表這個(gè)類(lèi)以及維護(hù)這些數(shù)據(jù)的類(lèi)是完全解耦的:它們彼此相互獨(dú)立復(fù)用,但也能協(xié)同工作。這些表示類(lèi)彼此不清楚對(duì)方,但是正如它們所做的:它們知道在哪能找到它們需要展示的信息,它們也知道一旦數(shù)據(jù)發(fā)生變化就通知需要更新數(shù)據(jù)表示的那個(gè)類(lèi)。
這有一張圖描述了Subject/Observer的關(guān)系是怎樣的一對(duì)多的關(guān)系:
http://wiki.jikexueyuan.com/project/rxjava/images/chapter2_1.png" alt="" />
上面這張圖展示了一個(gè)Subject為3個(gè)Observers提供服務(wù)。很明顯,沒(méi)有理由去限制Observers的數(shù)量:如果有需要,一個(gè)Subject可以有無(wú)限多個(gè)Observers,當(dāng)subject狀態(tài)發(fā)生變化時(shí),這些Observers中的每一個(gè)都會(huì)收到通知。