意圖
定義對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時, 所有依賴於它的對象都得到通知並被自動更新。
場景
這次不說游戲了,假設我們需要在一個Web頁面上分頁顯示數據。首先需要一個分頁控制器和一個顯示數據的表格。開始,客戶的需求很簡單,需要兩個向前翻頁向後翻頁的按鈕作為控制器,還需要一個GridVIEw來顯示數據。你可能會這麼做:
l 在頁面上放兩個按鈕和一個GridVIEw控件
l 點擊了下一頁按鈕判斷是否超出了頁面索引,如果沒有的話更新GridVIEw中的數據,然後更新控件的當前頁,如果翻頁後是最後一頁的話把下一頁按鈕設置為不可用。
l 點擊了上一頁按鈕判斷是否超出了頁面索引,如果沒有的話更新GridVIEw中的數據,然後更新控件的當前頁,如果翻頁後是第一頁的話把上一頁按鈕設置為不可用。
在這裡,我們的翻頁控件僅僅和GridVIEw進行依賴,看似問題不大。沒有想到,客戶看了Demo後覺得這樣的體驗不好,希望在頁面上呈現當前頁和總共頁。於是,我們又在頁面上加了一個Label控件,在按鈕的點擊事件裡面再去更新Label控件的值。客戶挺滿意的,隨著軟件中數據越來越多,總頁數達到了幾十頁,客戶覺得前後翻頁太不合理的了,希望有一個顯示頁數列表的分頁控制器,客戶的這個請求徹底使我們暈了,代碼被我們修改的非常混亂:
l 點擊了列表分頁控件的頁數後更新自身狀態、通知GridVIEw加載數據、通知按鈕分頁控件更新自身狀態、通知Label更新頁數信息。
l 點擊了按鈕分頁控件後更新自身狀態、通知GridVIEw加載數據、通知列表分頁控件更新自身狀態、通知Label更新頁數信息。
如果今後頁面上還需要針對分頁功能有任何修改的話,真不知道怎麼去改。由此引入觀察者模式來解決這些問題。