java觀察者模式

其他設(shè)計(jì)模式
java單例模式
java建造者模式
java策略模式
java代理模式
java觀察者模式
java適配器模式
java外觀模式

觀察者模式又叫做發(fā)布-訂閱(Publish/Subscribe)模式拂檩。

觀察者模式定義了一種一對(duì)多的依賴關(guān)系返劲,讓多個(gè)觀察者對(duì)象同時(shí)監(jiān)聽某一個(gè)主題對(duì)象。這個(gè)主題對(duì)象在狀態(tài)發(fā)生變化時(shí)尖啡,會(huì)通知所有觀察者對(duì)象含懊,使它們能夠自己更新自己。

Observer結(jié)構(gòu)圖.png

Subject類,可翻譯成為主題或抽象通知者范抓,一般用一個(gè)抽象類或者一個(gè)接口實(shí)現(xiàn)。它把所有對(duì)觀察者對(duì)象的引用保存在一個(gè)集合里食铐,每個(gè)主題都可以有任何數(shù)量的觀察者匕垫。抽象主題提供一個(gè)接口,可以增加和刪除觀察者對(duì)象虐呻。

interface Subject {
    //添加觀察者
    void addObserver(Observer obj);
    //移除觀察者
    void deleteObserver(Observer obj);
    //當(dāng)主題方法改變時(shí),這個(gè)方法被調(diào)用,通知所有的觀察者
    void notifyObserver();
}

Observer類象泵,抽象觀察者,為所有的具體觀察者定義一個(gè)接口斟叼,在得到主題的通知時(shí)更新自己偶惠,這個(gè)接口叫做更新接口。抽象觀察者一般用一個(gè)抽象類或者一個(gè)接口實(shí)現(xiàn)朗涩,更新接口通常包含一個(gè)Update()方法忽孽,這個(gè)方法叫做更新方法。

interface Observer {
    public void update();
}

ConcreteSubject類谢床,叫做具體主題或具體通知者兄一,將有關(guān)狀態(tài)存入具體觀察者對(duì)象,在具體主題的內(nèi)部狀態(tài)改變時(shí)萤悴,給所有登記過的觀察者發(fā)出通知瘾腰。這里舉例老師給學(xué)生布置作業(yè)。

public class TeacherSubject implements Subject {
    //用來存放和記錄觀察者
    private List<Observer> observers=new ArrayList<Observer>();
    //記錄狀態(tài)的字符串
    private String info;

    @Override
    public void addObserver(Observer obj) {
        observers.add(obj);
    }

    @Override
    public void deleteObserver(Observer obj) {
        int i = observers.indexOf(obj);
        if(i>=0){
            observers.remove(obj);
        }
    }

   @Override
    public void notifyObserver() {
        for (Observer observer:observers) {
            observer.update();
        }
    }

    public String getInfo() {
        return info;
    }

    public void setInfo(String info) {
        this.info = info;
    }
}

ConcreteObserver類覆履,具體觀察者蹋盆,實(shí)現(xiàn)抽象觀察者角色所要求的更新接口费薄,以便使本身的狀態(tài)與主題狀態(tài)相協(xié)調(diào),具體觀察者角色可以保存一個(gè)指向具體主題對(duì)象的引用栖雾。

public class StudentObserver implements Observer {

    //保存一個(gè)Subject的引用,以后如果可以想取消訂閱,有了這個(gè)引用會(huì)比較方便
    private TeacherSubject teacher;
    //學(xué)生的姓名,用來標(biāo)識(shí)不同的學(xué)生對(duì)象
    private String name;
    //構(gòu)造器用來注冊(cè)觀察者
    public StudentObserver(String name,TeacherSubject teacher) {
        this.name=name;
        this.teacher = teacher;
        //每新建一個(gè)學(xué)生對(duì)象,默認(rèn)添加到觀察者的行列
        teacher.addObserver(this);
    }


    @Override
    public void update() {
        System.out.println(name+"得到作業(yè):"+teacher.getInfo());
    }

}

測(cè)試用例

public class TestObserver {
     public static void main(String []args) throws Exception {
        TeacherSubject teacher=new TeacherSubject();
         StudentObserver jack=new StudentObserver("jack",teacher);
         StudentObserver mark=new StudentObserver("mark",teacher);
         teacher.setInfo("測(cè)試題1");
         teacher.notifyObserver();

         teacher.setInfo("測(cè)試題2");
         teacher.deleteObserver(jack);
         teacher.notifyObserver();
     }
}

輸出結(jié)果
jack得到作業(yè):測(cè)試題1
mark得到作業(yè):測(cè)試題1
mark得到作業(yè):測(cè)試題2

觀察者模式在android中的應(yīng)用

首先在Android中楞抡,我們往ListView添加數(shù)據(jù)后,都會(huì)調(diào)用Adapter的notifyDataChanged()方法析藕,其中使用了觀察者模式召廷。
當(dāng)ListView的數(shù)據(jù)發(fā)生變化時(shí),調(diào)用Adapter的notifyDataSetChanged函數(shù)账胧,這個(gè)函數(shù)又會(huì)調(diào)用DataSetObservable的notifyChanged函數(shù)竞慢,這個(gè)函數(shù)會(huì)調(diào)用所有觀察者(AdapterDataSetObserver)的onChanged方法,在onChanged函數(shù)中又會(huì)調(diào)用ListView重新布局的函數(shù)使得ListView刷新界面治泥。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末筹煮,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子居夹,更是在濱河造成了極大的恐慌败潦,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件准脂,死亡現(xiàn)場(chǎng)離奇詭異劫扒,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)狸膏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門沟饥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人环戈,你說我怎么就攤上這事闷板。” “怎么了院塞?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵拖吼,是天一觀的道長(zhǎng)骇扇。 經(jīng)常有香客問我倒淫,道長(zhǎng)甲棍,這世上最難降的妖魔是什么挺物? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任裹匙,我火速辦了婚禮锚国,結(jié)果婚禮上托享,老公的妹妹穿的比我還像新娘其兴。我一直安慰自己顶瞒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布元旬。 她就那樣靜靜地躺著榴徐,像睡著了一般守问。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上坑资,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天耗帕,我揣著相機(jī)與錄音,去河邊找鬼袱贮。 笑死仿便,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的攒巍。 我是一名探鬼主播嗽仪,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼柒莉!你這毒婦竟也來了钦幔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤常柄,失蹤者是張志新(化名)和其女友劉穎鲤氢,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體西潘,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡卷玉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了喷市。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片相种。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖品姓,靈堂內(nèi)的尸體忽然破棺而出寝并,到底是詐尸還是另有隱情,我是刑警寧澤腹备,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布衬潦,位于F島的核電站,受9級(jí)特大地震影響植酥,放射性物質(zhì)發(fā)生泄漏镀岛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一友驮、第九天 我趴在偏房一處隱蔽的房頂上張望漂羊。 院中可真熱鬧,春花似錦卸留、人聲如沸走越。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)旨指。三九已至赏酥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間淤毛,已是汗流浹背今缚。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留低淡,地道東北人姓言。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蔗蹋,于是被迫代替她去往敵國(guó)和親何荚。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

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

  • 概述 觀察者模式是對(duì)象的行為模式猪杭,又叫發(fā)布-訂閱(Publish/Subscribe)模式餐塘、模型-視圖(Model...
    今晚打肉山閱讀 557評(píng)論 0 3
  • 概念 觀察者可以有多,觀察一個(gè),或者一個(gè)觀察一個(gè)在android開發(fā)中經(jīng)常使用接口回調(diào)的方式來通知觀察者,有個(gè)缺點(diǎn)...
    JackTangIT閱讀 405評(píng)論 0 0
  • Java 觀察者模式,也可以叫做Publish/Subscribe模式皂吮。簡(jiǎn)單理解戒傻,多個(gè)Observer可以訂閱一個(gè)...
    奔跑的笨鳥閱讀 323評(píng)論 0 0
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,283評(píng)論 25 707
  • 彩稿黑白稿打印的好網(wǎng)址 店名:墨韻核藝 彩色A3A4銅版紙打印(打印彩色效果不錯(cuò)蜂筹,可以用普通紙打印需纳,會(huì)便宜一點(diǎn)) ...
    夢(mèng)海蓉閱讀 887評(píng)論 0 4