????????觀察者模式用于建立一種對(duì)象與對(duì)象之間的依賴關(guān)系,一個(gè)對(duì)象發(fā)生改變時(shí)將自動(dòng)通知其他對(duì)象,其他對(duì)象將相應(yīng)作出反應(yīng)帆离。在觀察者模式中,發(fā)生改變的對(duì)象稱為觀察目標(biāo)结澄,而被通知的對(duì)象稱為觀察者哥谷,一個(gè)觀察目標(biāo)可以對(duì)應(yīng)多個(gè)觀察者,而且這些觀察者之間可以沒有任何相互聯(lián)系麻献,可以根據(jù)需要增加和刪除觀察者们妥,使得系統(tǒng)更易于擴(kuò)展。
觀察者模式(Observer Pattern):定義對(duì)象之間的一種一對(duì)多依賴關(guān)系勉吻,使得每當(dāng)一個(gè)對(duì)象狀態(tài)發(fā)生改變時(shí)监婶,其相關(guān)依賴對(duì)象皆得到通知并被自動(dòng)更新。
在有些更加復(fù)雜的情況下,具體觀察者類ConcreteObserver的update()方法在執(zhí)行時(shí)需要使用到具體目標(biāo)類ConcreteSubject中的狀態(tài)(屬性)惑惶,因此在ConcreteObserver與ConcreteSubject之間有時(shí)候還存在關(guān)聯(lián)或依賴關(guān)系煮盼。
觀察目標(biāo)的典型代碼如下所示:
class Subject {
? ? //定義一個(gè)觀察者集合用于存儲(chǔ)所有觀察者對(duì)象
????protected ArrayList observers<Observer> = new ArrayList();
????//注冊(cè)方法,用于向觀察者集合中增加一個(gè)觀察者
????public void attach(Observer observer) {
? ? ????observers.add(observer);
????}
? ? //注銷方法带污,用于在觀察者集合中刪除一個(gè)觀察者
????public void detach(Observer observer) {
? ????? observers.remove(observer);
????}
????public void notify(){
????????//遍歷觀察者集合僵控,調(diào)用每一個(gè)觀察者的響應(yīng)方法
????????for(Object obs:observers) {
????????????((Observer)obs).update();
????????}
????}
}
JDK對(duì)觀察者模式的支持
在JDK的java.util包中,提供了Observable類以及Observer接口刮刑,它們構(gòu)成了JDK對(duì)觀察者模式的支持喉祭。
我們可以直接使用Observer接口和Observable類來作為觀察者模式的抽象層,再自定義具體觀察者類和具體觀察目標(biāo)類雷绢,從而在java中使用觀察者模式泛烙。
觀察者模式與MVC
MVC是一種架構(gòu)模式,它包含三個(gè)角色:模型(Model)翘紊,視圖(View)和控制器(Controller)蔽氨。其中模型可對(duì)應(yīng)于觀察者模式中的觀察目標(biāo),而視圖對(duì)應(yīng)于觀察者帆疟,控制器可充當(dāng)兩者之間的中介者鹉究。模型層提供的數(shù)據(jù)是視圖層所觀察的對(duì)象,當(dāng)模型層的數(shù)據(jù)發(fā)生改變時(shí)踪宠,視圖層將自動(dòng)改變其顯示內(nèi)容自赔。
觀察者模式的主要優(yōu)點(diǎn)如下:
? ? ? (1) 觀察者模式可以實(shí)現(xiàn)表示層和數(shù)據(jù)邏輯層的分離,定義了穩(wěn)定的消息更新傳遞機(jī)制柳琢,并抽象了更新接口绍妨,使得可以有各種各樣不同的表示層充當(dāng)具體觀察者角色。
? ? ? (2) 觀察者模式在觀察目標(biāo)和觀察者之間建立一個(gè)抽象的耦合柬脸。觀察目標(biāo)只需要維持一個(gè)抽象觀察者的集合他去,無須了解其具體觀察者。
? ? (3)?觀察者模式支持廣播通信倒堕,觀察目標(biāo)會(huì)向所有已注冊(cè)的觀察者對(duì)象發(fā)送通知灾测,簡化了一對(duì)多系統(tǒng)設(shè)計(jì)的難度。