觀察者模式

Android進(jìn)階之設(shè)計模式

觀察者模式

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

使用場景:

  1. 關(guān)聯(lián)行為場景. 需要注意的是,關(guān)聯(lián)行為是可以拆分的,而不是"組合"關(guān)系.
  2. 事件多級觸發(fā)場景.
  3. 跨系統(tǒng)的消息交換場景. 如消息隊列,事件總線的處理機制.

優(yōu)點: 觀察者和被觀察者之間是抽象耦合,應(yīng)對業(yè)務(wù)變化. 增強系統(tǒng)靈活性,可擴展性.

缺點: 在使用時應(yīng)該考慮一下開發(fā)效率和運行效率.程序中包含一個被觀察者,多個觀察者,開發(fā)和調(diào)試等內(nèi)容會比較復(fù)雜,而且在 Java 中消息的通知默認(rèn)是順序執(zhí)行的,一個觀察者卡頓,會影響整體的執(zhí)行效率,這種情況下,一般采用異步的方式.

舉個例子:


//程序員是觀察者
public class Coder implements Observer {
    private String name;

    public Coder(String name) {
        this.name = name;
    }

    @Override
    public void update(Observable o, Object arg) {
        System.out.println("Hi, "+ name+", DEvTechFrontier 更新啦,內(nèi)容是 "+arg);
    }

    @Override
    public String toString() {
        return "碼農(nóng) : "+name;
    }
}


/**
 * DevTechFrontier 開發(fā)技術(shù)前線,這個網(wǎng)站就被觀察者角色,當(dāng)它更新時所有的
 * 觀察者都會收到相應(yīng)的通知.
 * */
public class DevTechFrontier extends Observable{

    public void postNewFeed(String content){
        //標(biāo)識狀態(tài)或者內(nèi)容發(fā)生變化.
        setChanged();
        //通知所有觀察者
        notifyObservers(content);
    }
}

 public static void main(String[] args) {
 
 
        //被觀察者角色
        DevTechFrontier devTechFrontier = new DevTechFrontier();

        //觀察者

        Coder mrsimple = new Coder("mr.simple");
        Coder coder1 = new Coder("code-1");
        Coder coder2 = new Coder("code-2");
        Coder coder3 = new Coder("code-3");

        devTechFrontier.addObserver(mrsimple);
        devTechFrontier.addObserver(coder1);
        devTechFrontier.addObserver(coder2);
        devTechFrontier.addObserver(coder3);

        devTechFrontier.postNewFeed("新一期的內(nèi)容更新啦");
}

打印出來結(jié)果:

Hi, code-3, DEvTechFrontier 更新啦,內(nèi)容是 新一期的內(nèi)容更新啦
Hi, code-2, DEvTechFrontier 更新啦,內(nèi)容是 新一期的內(nèi)容更新啦
Hi, code-1, DEvTechFrontier 更新啦,內(nèi)容是 新一期的內(nèi)容更新啦
Hi, mr.simple, DEvTechFrontier 更新啦,內(nèi)容是 新一期的內(nèi)容更新啦

能看出來通知順序是,后添加進(jìn)去的先通知到.

?著作權(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)容

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