国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

NotFound / 2200人閱讀

摘要:關(guān)鍵概念理解觀察者設(shè)計模式中主要區(qū)分兩個概念觀察者指觀察者對象,也就是消息的訂閱者被觀察者指要觀察的目標對象,也就是消息的發(fā)布者。

原文首發(fā)于微信公眾號:jzman-blog,歡迎關(guān)注交流!

最近補一下設(shè)計模式相關(guān)的知識,關(guān)于觀察者設(shè)計模式主要從以下幾個方面來學習,具體如下:

什么是觀察者設(shè)計模式

關(guān)鍵概念理解

通知觀察者的方式

觀察者模式的實現(xiàn)

觀察者模式的優(yōu)缺點

使用場景

下面來一張本節(jié)內(nèi)容的思維導圖,具體如下:

什么是觀察者設(shè)計模式

觀察者模式(Observer)是軟件設(shè)計模式的一種,定義了對象之間一種一對多的關(guān)系,也就是當一個對象數(shù)據(jù)發(fā)生變化時,會通知與之依賴的其他對象,以相應其數(shù)據(jù)變化,這種當目標對象數(shù)據(jù)發(fā)生變化時,與之對應的觀察者對象數(shù)據(jù)隨之發(fā)生變化的,具有一對多通知關(guān)系的設(shè)計模式叫做觀察者設(shè)計模式

關(guān)鍵概念理解

觀察者設(shè)計模式中主要區(qū)分兩個概念:

觀察者:指觀察者對象,也就是消息的訂閱者

被觀察者:指要觀察的目標對象,也就是消息的發(fā)布者

通知觀察者的方式

當被被觀察者數(shù)據(jù)發(fā)生變化時,主要通過兩種方式通知觀察者,具體如下:

:消息以類似廣播的形式通知觀察者,觀察者只能被動、無條件接受;

:接收到被觀察者的通知,可以自主決定獲取消息。

觀察者模式的實現(xiàn)

下面通過兩種方式實現(xiàn)觀察者設(shè)計模式的實現(xiàn),具體如下:

手寫觀察者設(shè)計模式

Java API 提供的觀察者設(shè)計模式 使用 Java API 提供的 Observer 和 Observeable 實現(xiàn)觀察者模式

1. 手寫觀察者模式

首先創(chuàng)建被觀察者,具體如下:

/**
 * 觀察者要觀察的目標對象
 * @author jzman
 */
public abstract class Subject {
    protected ArrayList observerList = new ArrayList<>();
    //表示觀察者對目標對象(被觀察者)開始觀察
    public void registerObserver(Observer obs) {
        observerList.add(obs);
    }
    //表示取消某觀察者對目標對象(被觀察者)的觀察
    public void unRegisterObserver(Observer obs) {
        observerList.remove(obs);
    }
    //當目標對象(被觀察者)的狀態(tài)發(fā)生變化時,及時更新觀察者的狀態(tài)
    public void notifyAllObserver(){
        for (Observer observer : observerList) {
            observer.update(this);
        }
    }
}

創(chuàng)建具體的被觀察者,具體如下:

/**
 * 具體的目標對象(被觀察者)
 * @author jzman
 */
public class ConcreteSubject extends Subject{
        private int state;
        public int getState() {
            return state;
        }
        public void setState(int state) {
            this.state = state;
            //當數(shù)據(jù)發(fā)生變化時通知其他的觀察者
            notifyAllObserver();
        }
}

然后,為了統(tǒng)一方便,定義觀察者接口,具體如下:

/**
 * 觀察者統(tǒng)一接口
 * @author jzman
 */
public interface Observer {
    void update(Subject subject);
}

然后,創(chuàng)建具體的觀察者,具體如下:

/**
 * 具體的觀察者
 * @author jzman
 */
public class ConcreteObserver implements Observer{
    private int state;
    public int getState() {
        return state;
    }
    public void setState(int state) {
        this.state = state;
    }
    @Override
    public void update(Subject subject) {
        //獲取目標對象的數(shù)據(jù)變化,同時更新當前觀察者
        ConcreteSubject concreteSubject = (ConcreteSubject)subject;
        state = concreteSubject.getState();
    }
}

最后,測試觀察者設(shè)計模式,具體如下:

/**
 * Main
 * @author jzman
 */
public class Client {
    public static void main(String[] args) {
        //創(chuàng)建具體的目標對象(被觀察者)
        ConcreteSubject concreteSubject = new ConcreteSubject();
        //創(chuàng)建多個具體的觀察者
        ConcreteObserver obs1 = new ConcreteObserver();
        ConcreteObserver obs2 = new ConcreteObserver();
        ConcreteObserver obs3 = new ConcreteObserver();
        //讓觀察者觀察目標對象(被觀察者)的數(shù)據(jù)變化
        concreteSubject.observerList.add(obs1);
        concreteSubject.observerList.add(obs2);
        concreteSubject.observerList.add(obs3);
        //改變某個目標對象(被觀察者)的數(shù)據(jù)
        concreteSubject.setState(10);
        //觀察者數(shù)據(jù)是否與被觀察者數(shù)據(jù)變化一致
        System.out.println("觀察者obs1:"+obs1.getState());
        System.out.println("觀察者obs2:"+obs2.getState());
        System.out.println("觀察者obs3:"+obs3.getState());
    }
}

顯然,執(zhí)行結(jié)果肯定如下:

觀察者obs1:10
觀察者obs2:10
觀察者obs3:10

通過對目標對象數(shù)據(jù)的改變,更新了與之相對應的觀察者的數(shù)據(jù),實現(xiàn)了消息的訂閱和發(fā)送。

2. Java API 提供的觀察者設(shè)計模式

Java API 提供的觀察者設(shè)計模式主要通過 Observer 和 Observeable 來實現(xiàn),首先創(chuàng)建一個類繼承 Observeable 作為被觀察者,具體如下:

/**
 * 被觀察者(目標對象)
 * @author jzman
 */
public class ConcreteSubject extends Observable{
    private int state;
    public int getState() {
        return state;
    }
    public void setState(int state) {
        this.state = state;
        //表示數(shù)據(jù)已經(jīng)發(fā)生變化
        setChanged();
        //具體的目標對象數(shù)據(jù)變化的時候通知觀察者
        notifyObservers(state);
    }
}

然后,創(chuàng)建一個類繼承 Observer 作為觀察者,具體如下:

/**
 * 觀察者
 * @author jzman
 */
public class ConcreteObserver implements Observer{
    private int state;
    public int getState() {
        return state;
    }
    public void setState(int state) {
        this.state = state;
    }
    @Override
    public void update(Observable arg0, Object arg1) {
        ConcreteSubject concreteSubject = (ConcreteSubject) arg0;
        //根據(jù)目標對象(被觀察者)的數(shù)據(jù)變化更新當前觀察者的數(shù)據(jù)
        this.state = concreteSubject.getState();
    }
}

最后,測試觀察者設(shè)計模式,具體如下:

/**
 * 測試觀察者設(shè)計模式
 * @author jzman
 */
public class Client {
    public static void main(String[] args) {
        ConcreteSubject concreteSubject = new ConcreteSubject();
        
        ConcreteObserver obs1 = new ConcreteObserver();
        ConcreteObserver obs2 = new ConcreteObserver();
        ConcreteObserver obs3 = new ConcreteObserver();
        
        concreteSubject.addObserver(obs1);
        concreteSubject.addObserver(obs2);
        concreteSubject.addObserver(obs3);
        
        concreteSubject.setState(100);
        
        System.out.println("觀察者obs1:"+obs1.getState());
        System.out.println("觀察者obs2:"+obs2.getState());
        System.out.println("觀察者obs3:"+obs3.getState());
    }
}

顯然,執(zhí)行結(jié)果肯定如下:

觀察者obs1:100
觀察者obs2:100
觀察者obs3:100
觀察者模式的優(yōu)缺點

優(yōu)點:觀察者與被觀察者抽象耦合,可定義一種穩(wěn)定的消息觸發(fā)機制。

缺點:如果被觀察者有多個間接的觀察者,消息的傳遞將消耗更多時間,如果觀察者被觀察者之間循環(huán)依賴,最終會導致系統(tǒng)崩潰。

使用場景

觀察者設(shè)計模式在開發(fā)中使用比較廣泛,主要有以下幾個場景,具體如下:

如游戲、聊天等過程中消息的從服務端轉(zhuǎn)發(fā)給客戶端的過程

Android 中的廣播機制以及 ListView 中通知數(shù)據(jù)發(fā)生變化時也是觀察者設(shè)計模式

訂閱類相關(guān)的系統(tǒng),如當訂閱的主題有更新,訂閱者就會同步訂閱的文章。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/74431.html

相關(guān)文章

  • JS設(shè)計模式Obeserver(察者模式、Publish/Subscribe(發(fā)布/訂閱)模式

    摘要:觀察者模式定義設(shè)計模式中對的定義一個對象稱為維持一系列依賴于它觀察者的對象,將有關(guān)狀態(tài)的任何變更自動通知給它們。如圖模式比較觀察者模式則多了一個類似于話題調(diào)度中心的流程,發(fā)布者和訂閱者解耦。 Obeserver(觀察者)模式 定義 《js設(shè)計模式》中對Observer的定義:一個對象(稱為subject)維持一系列依賴于它(觀察者)的對象,將有關(guān)狀態(tài)的任何變更自動通知給它們。 《設(shè)計模...

    荊兆峰 評論0 收藏0
  • Java設(shè)計模式察者模式

    摘要:觀察者模式的使用場景比如你微博關(guān)注了一個人,那么這個人發(fā)布的微博就會推送到你這。 Java設(shè)計模式之觀察者模式 一直想寫一篇學習觀察者模式的總結(jié)沒有契機,今天學習阻塞隊列的原理時候看到在實現(xiàn)生產(chǎn)者消費者的時候用到了通知模式,就是所謂的觀察者模式,正好順便整理一下。 1. 簡介 觀察者模式定義對象間的一種一對多的依賴關(guān)系,當一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知并被自動更...

    haitiancoder 評論0 收藏0
  • PHP設(shè)計模式察者模式

    摘要:概念觀察者模式屬于行為模式,是定義對象間的一種一對多的依賴關(guān)系,以便當一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知并自動刷新。觀察者模式符合接口隔離原則,實現(xiàn)了對象之間的松散耦合。 概念 觀察者模式屬于行為模式,是定義對象間的一種一對多的依賴關(guān)系,以便當一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知并自動刷新。 當一個對象狀態(tài)發(fā)生改變后,會影響到其他幾個對象的改變,這...

    phpmatt 評論0 收藏0
  • php面向?qū)ο?em>設(shè)計模式 察者模式

    摘要:最近在學的設(shè)計模式,看到了觀察者模式,在此寫下一點理解問題假如一個小販,他把產(chǎn)品的價格提升了,不同的消費者會對此產(chǎn)生不同的反應。 最近在學php 的設(shè)計模式, 看到了觀察者模式,在此寫下一點理解: 問題: 假如一個小販, 他把產(chǎn)品的價格提升了, 不同的消費者會對此產(chǎn)生不同的反應。一般的編程模式無非是獲取提升的價格,然后獲取所有的消費者,再循環(huán)每個消費者, 不同的消費者根據(jù)價格漲幅...

    genedna 評論0 收藏0
  • Python版設(shè)計模式監(jiān)聽者模式

    摘要:監(jiān)聽模式又名觀察者模式發(fā)布訂閱模式源監(jiān)聽器模式,模式的核心是設(shè)計時要區(qū)分誰是被觀察者,誰是觀察者。 監(jiān)聽模式 又名觀察者模式、發(fā)布/訂閱模式、源-監(jiān)聽器(Source/Listener)模式,模式的核心是:設(shè)計時要區(qū)分誰是被觀察者,誰是觀察者。被觀察者至少有三個方法,添加觀察者、刪除觀察者、監(jiān)聽目標變化并通知觀察者;觀察者這至少包含一個方法,當接收到被觀察者的通知時,做出相應的處理(即...

    hlcfan 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<