設(shè)計模式——觀察者模式

定義:定義對象間一種對多種的依賴關(guān)系,使得每當一個對象改變狀態(tài),則所有依賴它的對象都會得到通知并被自動更新

觀察者模式是一種常見的模式,常見的BroadCast和EventBus都是觀察者模式.
他們都有注冊的過程,post來通知改變,然后所有的觀察者都能被通知到.其實平時我們使用的setOnclicklistener也是觀察者模式,?只不過他是單對單的觀察者模式.
觀察者模式的UML圖為下(不拘泥于UML圖,僅供參考)

573860a9g75c0ec0401ba&690&690.gif

觀察者模式中得幾種角色

  • ?Suject:抽象主題,也就是被觀察(Observable)的角色,抽象主題把所有觀察者對象的引用保存在一個集合里,每個主題都可以有任意數(shù)量的觀察者,抽象主題提供一個借口,可以增加和刪除觀察者對象。
  • Observer:抽象觀察者,該角色是觀察者的抽象類,它定義了一個更新接口,使得在得到主題的更改通知時更新自己
  • ConcreteSubject:?具體主題,當被觀察者發(fā)生變化的時候,給注冊過的觀察者發(fā)出通知.
  • ConcreteObserver:具體的觀察者,接受到通知后,更新自己的狀態(tài)

下面貼出示例代碼

//抽象觀察者角色
public interface Watcher
{
    public void update(String str);

}
//具體觀察者角色
public class ConcreteWatcher implements Watcher
{

    @Override
    public void update(String str)
    {
        System.out.println(str);
    }

}
//抽象主題角色,也是被觀察角色
public interface Watched
{
    public void addWatcher(Watcher watcher);

    public void removeWatcher(Watcher watcher);

    public void notifyWatchers(String str);

}
//具體被觀察者
public class ConcreteWatched implements Watched
{
    // 存放觀察者
    private List<Watcher> list = new ArrayList<Watcher>();

    @Override
    public void addWatcher(Watcher watcher)
    {
        list.add(watcher);
    }

    @Override
    public void removeWatcher(Watcher watcher)
    {
        list.remove(watcher);
    }

    @Override
    public void notifyWatchers(String str)
    {
        // 自動調(diào)用實際上是主題進行調(diào)用的
        for (Watcher watcher : list)
        {
            watcher.update(str);
        }
    }

}
public class Test
{
    public static void main(String[] args)
    {
        Watched girl = new ConcreteWatched();
        
        Watcher watcher1 = new ConcreteWatcher();
        Watcher watcher2 = new ConcreteWatcher();
        Watcher watcher3 = new ConcreteWatcher();
        
        girl.addWatcher(watcher1);
        girl.addWatcher(watcher2);
        girl.addWatcher(watcher3);
        
        girl.notifyWatchers("開心");
    }

}

上述示例代碼來自博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本文的結(jié)構(gòu)如下: 什么是觀察者模式 為什么要用該模式 模式的結(jié)構(gòu) 代碼示例 推模型和拉模型 優(yōu)點和缺點 適用環(huán)境 ...
    w1992wishes閱讀 1,523評論 0 16
  • 前言 Android的設(shè)計模式系列文章介紹,歡迎關(guān)注,持續(xù)更新中: Android的設(shè)計模式-設(shè)計模式的六大原則一...
    四月葡萄閱讀 30,810評論 7 63
  • 一、 概述 觀察者模式是對象的行為模式,又叫發(fā)布-訂閱(Publish/Subscribe)模式、模型-視圖(Mo...
    步積閱讀 1,359評論 0 1
  • 觀察者模式中通常有兩個基本的概念主題:觀察者和被觀察者。當被觀察者狀態(tài)發(fā)生改變時,需要通知相應(yīng)的觀察者,當然,每個...
    時待吾閱讀 1,158評論 0 2
  • 相信大家都有看過《喜洋洋與灰太狼》,說的是灰太狼和羊族的“斗爭”,而每次的結(jié)果都是灰太狼一飛沖天,伴隨著一句“我還...
    Jet啟思閱讀 5,514評論 9 23

友情鏈接更多精彩內(nèi)容