原文首發(fā)于我的微信公眾號:GeekArtT.
Observer設(shè)計(jì)模式是為了解決“信息同步更新”的問題而存在的。它試圖解決這樣一個(gè)問題:如果有“一堆對象”都跟隨“某一對象”的變化而變化,那么,如何能夠保持“這堆對象”能夠同步更新呢?特別是,“這堆對象”很可能在運(yùn)行時(shí)(run-time)不斷被添加或者被刪除,你設(shè)計(jì)的機(jī)制該如何既能保持增添/刪除的靈活性,而又能使“當(dāng)前這堆對象”同步更新呢?
僅僅是抽象地看待上述這個(gè)問題,或許很難有思路。解決方案的形成可以依托于生活中具體業(yè)務(wù)場景的類比。
很多書籍介紹觀察者(Observer)這個(gè)設(shè)計(jì)模式喜歡運(yùn)用“內(nèi)容訂閱者”和“發(fā)布信息平臺”的對應(yīng)關(guān)系。這個(gè)比喻從生產(chǎn)流程上講,完全符合,但是作為比喻,還是顯得有些生硬。我認(rèn)為,一個(gè)更好的、更富有啟發(fā)性的類比是“品牌商店”與“旗下加盟商/分店”在價(jià)格上的依存關(guān)系。好不夸張的說,一旦做出這個(gè)類比,解決方案就會自然浮現(xiàn)。
例如,McDonald在一座城市開店,其價(jià)格都是高度統(tǒng)一。如果某一個(gè)分店的價(jià)格低于別的分店,就會打亂跨國大公司的整體戰(zhàn)略部署,是絕不允許的。所以,一個(gè)核心的目標(biāo)是,每一個(gè)分店的價(jià)格都必須時(shí)刻同步統(tǒng)一。另一方面,每個(gè)地區(qū)的分店,都有可能隨著市場的反饋而做出調(diào)整:或者因?yàn)殇N量過低而關(guān)閉,或者因?yàn)槟硞€(gè)新的商圈的出現(xiàn)而增加分店。那么,在分店的數(shù)目、位置都在隨時(shí)變動的情形下,應(yīng)該用一套什么機(jī)制才能保證分布在城市各地的分店都使用統(tǒng)一的價(jià)格呢?<