觀察者模式

結(jié)構(gòu)型設計模式

簡要定義

定義了對象之間的一對多依賴,當一個對象改變狀態(tài)時,它的所有依賴者都會受到通知并自動更新.

類圖

observer.png

要點

  • 觀察者模式定義了對象之間的一對多的關(guān)系.
  • 被觀察者用一個共同的接口來更新觀察者.
  • 觀察者與被觀察者松耦合,被觀察者不知道觀察者的細節(jié)
  • 有多個觀察者時,不可以依賴特定的通知次序(通知次序不定)

實現(xiàn)

以氣象站為例

public interface Subject {
    public void registerObserver(Observer O); 
    public void removeBoserver(Observer O);
    public void notifyObservers(); //當被觀察者狀態(tài)改變時,這個方法會被調(diào)用來通知所有的觀察者.
}
public interface Observer {
    public void update(float temp,float humidity,float pressure);  
    // 當氣象觀測值改變時,被觀察者把狀態(tài)值當做這個函數(shù)的參數(shù),傳給觀察者.
} 
public class WeatherData implements Subject {
    private ArrayList observers; //記錄觀察者
    private float temperature;
    private float humidity;
    private float pressure;

    public WeatherData() {
        observers = new ArrayList();
    }
    public void registerObserver(Observer o){
       observers.add(o);
    }
    public void removeBoserver(Observer o){
        int i =observers.indexOf(o);
        if(i>0){
            observers.remove(i);
         }
    }
    public void notifyObservers() {
        for(int i=0;i<observers.size;i++) {
            Observers observer= (Observer) observers.get(i);
            observer.update(temperature,humidity,pressure);
        }
    }
}
public class CurrentConditions implements Observer{
    private float temperature;
    private float humidity;
    private float pressure;
    private Subject weatherData; //被觀察者對象
    
    //在構(gòu)造器中實現(xiàn)觀察者登記
    public CurrentConditions(Subject weatherData){
        this.weatherData = weatherData;
        weatherData.registerObserver(this);
    }
    public void update(float temperature, float humidity,float pressure){
        this.temperature = temperature;
        this.humidity = humidity;
        this.pressure = pressure;
    }    
}

觀察者模式弊端

  • 如果觀察者過多的話趁矾,導致被觀察者中的列表太大洽腺,會有性能上的問題人弓。所以要視情況而定再使用,當然也可以結(jié)合線程池等來優(yōu)化。
  • 如果在被觀察者之間有循環(huán)依賴的話,被觀察者會觸發(fā)它們之間進行循環(huán)調(diào)用,導致系統(tǒng)崩潰宴凉。在使用觀察者模式是要特別注意這一點。

應用場景

  • 當需要將一個對象狀態(tài)的改變傳遞給其他對象,但不清楚有多少個具體待通知對象時.
  • 通知和待通知對象都是易變體,需要封裝變化時.
具體游戲場景應用
  • 事件分發(fā)管理器表悬。當用戶進行觸摸、按鍵等輸入后丧靡,輸入管理類將事件分發(fā)給添加了事件監(jiān)聽的對象蟆沫。
  • 游戲業(yè)務邏輯與游戲控制器。當游戲業(yè)務邏輯改變了自身狀態(tài)后温治,將該變化通知給添加了監(jiān)聽的控制器饭庞。

俄羅斯方塊偽代碼

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市熬荆,隨后出現(xiàn)的幾起案子舟山,更是在濱河造成了極大的恐慌,老刑警劉巖卤恳,帶你破解...
    沈念sama閱讀 212,718評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件累盗,死亡現(xiàn)場離奇詭異,居然都是意外死亡突琳,警方通過查閱死者的電腦和手機若债,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拆融,“玉大人蠢琳,你說我怎么就攤上這事【当” “怎么了傲须?”我有些...
    開封第一講書人閱讀 158,207評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長趟脂。 經(jīng)常有香客問我泰讽,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,755評論 1 284
  • 正文 為了忘掉前任菇绵,我火速辦了婚禮肄渗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘咬最。我一直安慰自己翎嫡,他們只是感情好,可當我...
    茶點故事閱讀 65,862評論 6 386
  • 文/花漫 我一把揭開白布永乌。 她就那樣靜靜地躺著惑申,像睡著了一般。 火紅的嫁衣襯著肌膚如雪翅雏。 梳的紋絲不亂的頭發(fā)上圈驼,一...
    開封第一講書人閱讀 50,050評論 1 291
  • 那天,我揣著相機與錄音望几,去河邊找鬼绩脆。 笑死,一個胖子當著我的面吹牛橄抹,可吹牛的內(nèi)容都是我干的靴迫。 我是一名探鬼主播,決...
    沈念sama閱讀 39,136評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼楼誓,長吁一口氣:“原來是場噩夢啊……” “哼玉锌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起疟羹,我...
    開封第一講書人閱讀 37,882評論 0 268
  • 序言:老撾萬榮一對情侶失蹤主守,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后榄融,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體参淫,經(jīng)...
    沈念sama閱讀 44,330評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,651評論 2 327
  • 正文 我和宋清朗相戀三年剃袍,在試婚紗的時候發(fā)現(xiàn)自己被綠了黄刚。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,789評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡民效,死狀恐怖憔维,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情畏邢,我是刑警寧澤业扒,帶...
    沈念sama閱讀 34,477評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站舒萎,受9級特大地震影響程储,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,135評論 3 317
  • 文/蒙蒙 一章鲤、第九天 我趴在偏房一處隱蔽的房頂上張望摊灭。 院中可真熱鬧,春花似錦败徊、人聲如沸帚呼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽煤杀。三九已至,卻和暖如春沪哺,著一層夾襖步出監(jiān)牢的瞬間沈自,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評論 1 267
  • 我被黑心中介騙來泰國打工辜妓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留枯途,地道東北人。 一個月前我還...
    沈念sama閱讀 46,598評論 2 362
  • 正文 我出身青樓籍滴,卻偏偏與公主長得像柔袁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子异逐,可洞房花燭夜當晚...
    茶點故事閱讀 43,697評論 2 351

推薦閱讀更多精彩內(nèi)容