溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java觀察者模式實例代碼分析

發(fā)布時間:2022-02-28 09:16:56 來源:億速云 閱讀:115 作者:iii 欄目:開發(fā)技術(shù)

這篇“Java觀察者模式實例代碼分析”文章的知識點大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“Java觀察者模式實例代碼分析”文章吧。

    優(yōu)點

    1.觀察者和被觀察者是抽象耦合的。

    2.建立一套觸發(fā)機制。

    缺點

    1.如果一個被觀察者對象有很多的直接和間接的觀察者的話,將所有的觀察者都通知到會花費很多時間。

    2.如果在觀察者和觀察目標之間有循環(huán)依賴的話,觀察目標會觸發(fā)它們之間進行循環(huán)調(diào)用,可能導(dǎo)致系統(tǒng)崩潰。

    3.觀察者模式?jīng)]有相應(yīng)的機制讓觀察者知道所觀察的目標對象是怎么發(fā)生變化的,而僅僅只是知道觀察目標發(fā)生了變化。

    使用場景

    一個抽象模型有兩個方面,其中一個方面依賴于另一個方面。將這些方面封裝在獨立的對象中使它們可以各自獨立地改變和復(fù)用。

    一個對象的改變將導(dǎo)致其他一個或多個對象也發(fā)生改變,而不知道具體有多少對象將發(fā)生改變,可以降低對象之間的耦合度。

    一個對象必須通知其他對象,而并不知道這些對象是誰。

    需要在系統(tǒng)中創(chuàng)建一個觸發(fā)鏈,A對象的行為將影響B(tài)對象,B對象的行為將影響C對象……,可以使用觀察者模式創(chuàng)建一種鏈式觸發(fā)機制。

    注意事項

    1.JAVA 中已經(jīng)有了對觀察者模式的支持類。

    2.避免循環(huán)引用。

    3.如果順序執(zhí)行,某一觀察者錯誤會導(dǎo)致系統(tǒng)卡殼,一般采用異步方式。

    一、實現(xiàn)方式

    1、觀察者抽象類

    package com.asurplus.common.observe;
    /**
     * 觀察者
     */
    public abstract class Observer {
        protected Subject subject;
        /**
         * 發(fā)布事件
         */
        public abstract void update();
    }

    2、第一個觀察者

    package com.asurplus.common.observe;
    import lombok.extern.slf4j.Slf4j;
    @Slf4j
    public class Observer1 extends Observer {
        public Observer1(Subject subject) {
            this.subject = subject;
            this.subject.attach(this);
        }
        @Override
        public void update() {
            log.info("觀察者 1 收到通知:{}", this.subject.getState());
        }
    }

    3、第二個觀察者

    package com.asurplus.common.observe;
    import lombok.extern.slf4j.Slf4j;
    @Slf4j
    public class Observer2 extends Observer {
        public Observer2(Subject subject) {
            this.subject = subject;
            this.subject.attach(this);
        }
        @Override
        public void update() {
            log.info("觀察者 2 收到通知:{}", this.subject.getState());
        }
    }

    4、第三個觀察者

    package com.asurplus.common.observe;
    import lombok.extern.slf4j.Slf4j;
    @Slf4j
    public class Observer3 extends Observer {
        public Observer3(Subject subject) {
            this.subject = subject;
            this.subject.attach(this);
        }
        @Override
        public void update() {
            log.info("觀察者 3 收到通知:{}", this.subject.getState());
        }
    }

    5、定義主題

    package com.asurplus.common.observe;
    import java.util.ArrayList;
    import java.util.List;
    /**
     * 主題
     */
    public class Subject {
        /**
         * 觀察者列表
         */
        private List<Observer> observers = new ArrayList<>();
        /**
         * 標志
         */
        private int state;
        public int getState() {
            return state;
        }
        /**
         * 標識被改變
         *
         * @param state
         */
        public void setState(int state) {
            this.state = state;
            // 通知所有觀察者
            notifyAllObservers();
        }
        /**
         * 添加進接收者列表
         *
         * @param observer
         */
        public void attach(Observer observer) {
            observers.add(observer);
        }
        /**
         * 通知所有人被改變
         */
        public void notifyAllObservers() {
            for (Observer observer : observers) {
                observer.update();
            }
        }
    }

    類似于消息發(fā)布一樣,有多個接收者,當標志位被改變的時候,通知多個接收者。

    二、測試

    package com.asurplus.common.observe;
    public class TestMain {
        public static void main(String[] args) {
            // 創(chuàng)建主題
            Subject subject = new Subject();
            // 添加觀察者
            new Observer1(subject);
            new Observer2(subject);
            new Observer3(subject);
            // 改變標志
            subject.setState(10);
        }
    }

    輸出結(jié)果

    Java觀察者模式實例代碼分析

    可以看出,三個接收者都收到了事件通知,從而實現(xiàn)了我們的觀察者模式。

    以上就是關(guān)于“Java觀察者模式實例代碼分析”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關(guān)的知識內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道。

    向AI問一下細節(jié)

    免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI