国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

笨蛋學(xué)設(shè)計(jì)模式行為型模式-觀察者模式【14】

這篇具有很好參考價(jià)值的文章主要介紹了笨蛋學(xué)設(shè)計(jì)模式行為型模式-觀察者模式【14】。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

8.1觀察者模式??????

8.1.1概念

? 觀察者模式定義了一種一對(duì)多的依賴關(guān)系,讓多個(gè)觀察者對(duì)象同時(shí)監(jiān)聽某一個(gè)主題對(duì)象,當(dāng)主題對(duì)象狀態(tài)發(fā)生變化時(shí),會(huì)通知所有依賴它的觀察者對(duì)象,使它們都能夠得到通知并且被自動(dòng)更新

8.1.2場(chǎng)景

? 在我們生活中,用戶可以在音樂播放平臺(tái)關(guān)注多個(gè)歌手,而當(dāng)有歌手發(fā)布新的歌曲時(shí),可以將歌曲發(fā)布到音樂播放平臺(tái),而平臺(tái)會(huì)將新的歌曲詳細(xì)信息發(fā)送給關(guān)注該歌手的用戶。而此時(shí)歌手就相當(dāng)于是觀察者模式的主題對(duì)象,每個(gè)關(guān)注的用戶則是觀察者模式中的觀察者對(duì)象,通過該模式,用戶可以很及時(shí)的聽到歌手的新歌曲,而歌手也可以很輕松的通知用戶新歌曲的發(fā)布。

8.1.3優(yōu)勢(shì) / 劣勢(shì)

  • 靈活性:提供了靈活的觀察者注冊(cè)機(jī)制,可以隨時(shí)添加或刪除觀察者,使得系統(tǒng)更加靈活和可擴(kuò)展
  • 自動(dòng)更新:當(dāng)被觀察者的狀態(tài)發(fā)生改變時(shí),所有依賴它的觀察者都會(huì)自動(dòng)收到通知并更新,提高了系統(tǒng)的自動(dòng)化程度

  • 性能影響:當(dāng)被觀察者的狀態(tài)發(fā)生改變時(shí),所有觀察者都會(huì)收到通知并且進(jìn)行相應(yīng)的通知,可能導(dǎo)致大量的通知和計(jì)算,影響系統(tǒng)性能
  • 通知競(jìng)態(tài)條件:若多個(gè)線程同時(shí)修改被觀察者的狀態(tài),可能會(huì)產(chǎn)生競(jìng)態(tài)條件,導(dǎo)致某些觀察者未能及時(shí)收到通知或收到錯(cuò)誤的通知

8.1.4觀察者模式可分為

  • 主題Subject:就是被觀察的對(duì)象,可以維護(hù)一組觀察者,當(dāng)主題本身發(fā)生改變時(shí)就會(huì)通知觀察者
  • 觀察者Observer:觀察主題的對(duì)象,當(dāng)"被觀察"的主題發(fā)生變化時(shí),觀察者就會(huì)得到通知并執(zhí)行相應(yīng)的處理

觀察者的基本結(jié)構(gòu):
  • 主題Subject:一般會(huì)定義成一個(gè)接口,提供方法用于注冊(cè)、刪除、通知觀察者,通常也包含一個(gè)狀態(tài),當(dāng)狀態(tài)發(fā)生改變時(shí),通知所有的觀察者
  • 觀察者Observer:觀察者也需要實(shí)現(xiàn)一個(gè)接口,包含一個(gè)更新方法,在接收主題通知時(shí)執(zhí)行對(duì)應(yīng)的操作
  • 具體主題ConcreteSubject:主題的具體實(shí)現(xiàn),維護(hù)一個(gè)觀察者列表,包含了觀察者的注冊(cè)、刪除、通知方法
  • 具體觀察者ConcreteObserver:觀察者接口的具體實(shí)現(xiàn),每個(gè)具體

8.1.5觀察者模式

package com.technologystatck.designpattern.mode.observer;

import java.util.ArrayList;
import java.util.List;

public class Observers {
    public static void main(String[] args) {

        //創(chuàng)建具體主題對(duì)象
        ConcreteSubject concreteSubject = new ConcreteSubject();

        //創(chuàng)建具體觀察者對(duì)象
        Observer concreteObserverA = new ConcreteObserver();
        Observer concreteObserverB = new ConcreteObserver();

        //注冊(cè)觀察者
        concreteSubject.registerObserver(concreteObserverA);
        concreteSubject.registerObserver(concreteObserverB);

        //調(diào)用主題方法
        concreteSubject.setState("有新的觀察者注冊(cè)");
    }
}

//主題接口(主題)
interface Subject{
    //注冊(cè)觀察者
    void registerObserver(Observer observer);

    //移除觀察者
    void removeObserver(Observer observer);

    //通知觀察者
    void notifyObserver();
}

//觀察者接口(觀察者)
interface Observer{
    //更新方法
    void update(String message);
}

//具體主題實(shí)現(xiàn)
class ConcreteSubject implements Subject{

    //觀察者列表
    private List<Observer> observers = new ArrayList<>();

    //狀態(tài)
    private String state;

    //注冊(cè)觀察者方法(注冊(cè))
    @Override
    public void registerObserver(Observer observer) {
        observers.add(observer);
    }

    //移除觀察者方法(移除)
    @Override
    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }

    //通知觀察者方法(通知)
    //遍歷觀察者列表,并通知每個(gè)觀察者更新狀態(tài)
    @Override
    public void notifyObserver() {
        for (Observer observer : observers) {
            observer.update(state);
        }
    }

    //更新狀態(tài)
    public void setState(String state) {
        this.state = state;
        notifyObserver();
    }
}
//具體觀察者實(shí)現(xiàn)
class ConcreteObserver implements Observer{
    //更新方法
    @Override
    public void update(String message) {
        System.out.println(message);
    }
}



8.1.6實(shí)戰(zhàn)

8.1.6.1題目描述

小明所在的學(xué)校有一個(gè)時(shí)鐘(主題),每到整點(diǎn)時(shí),它就會(huì)通知所有的學(xué)生(觀察者)當(dāng)前的時(shí)間,請(qǐng)你使用觀察者模式實(shí)現(xiàn)這個(gè)時(shí)鐘通知系統(tǒng)。

注意點(diǎn):時(shí)間從 0 開始,并每隔一個(gè)小時(shí)更新一次。

8.1.6.2輸入描述

輸入的第一行是一個(gè)整數(shù) N(1 ≤ N ≤ 20),表示學(xué)生的數(shù)量。

接下來的 N 行,每行包含一個(gè)字符串,表示學(xué)生的姓名。

最后一行是一個(gè)整數(shù),表示時(shí)鐘更新的次數(shù)。

8.1.6.3輸出描述

對(duì)于每一次時(shí)鐘更新,輸出每個(gè)學(xué)生的姓名和當(dāng)前的時(shí)間。文章來源地址http://www.zghlxwxcb.cn/news/detail-821433.html

8.1.6.4代碼
package com.technologystatck.designpattern.mode.observer;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        // 讀取學(xué)?數(shù)量
        int N = scanner.nextInt();
        // 創(chuàng)建時(shí)鐘
        Clock clock = new Clock();
        // 注冊(cè)學(xué)?觀察者
        for (int i = 0; i < N; i++) {
            String studentName = scanner.next();
            clock.registerObserver(new Student(studentName));
        }
        // 讀取時(shí)鐘更新次數(shù)
        int updates = scanner.nextInt();
        // 模擬時(shí)鐘每隔?個(gè)?時(shí)更新?次
        for (int i = 0; i < updates; i++) {
            clock.tick();
        }
    }
}

// 觀察者接?
interface Observer {
    void update(int hour);
}
// 主題接?
interface Subject {
    void registerObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObservers();
}
// 具體主題實(shí)現(xiàn)
class Clock implements Subject {
    private List<Observer> observers = new ArrayList<>();
    private int hour = 0;
    @Override
    public void registerObserver(Observer observer) {
        observers.add(observer);
    }
    @Override
    public void removeObserver(Observer observer) {
        observers.remove(observer);
    }
    @Override
    public void notifyObservers() {
        for (Observer observer : observers) {
            observer.update(hour);
        }
    }
    public void tick() {
        hour = (hour + 1) % 24; // 模擬時(shí)間的推移
        notifyObservers();
    }
}
// 具體觀察者實(shí)現(xiàn)
class Student implements Observer {
    private String name;
    public Student(String name) {
        this.name = name;
    }
    @Override
    public void update(int hour) {
        System.out.println(name + " " + hour);
    }
}


8.1.7總結(jié)

  • 優(yōu)點(diǎn):可以靈活的增加 / 刪除觀察者對(duì)象,而不影響其他相關(guān)對(duì)象的功能
  • 總結(jié):定義一對(duì)多的依賴關(guān)系,讓多個(gè)觀察者對(duì)象同時(shí)監(jiān)聽某一主題對(duì)象的狀態(tài)變化,實(shí)現(xiàn)自動(dòng)更新
  • 場(chǎng)景:適用于一個(gè)對(duì)象的狀態(tài)變化會(huì)影響到其他對(duì)象,并且希望這些對(duì)象在狀態(tài)變化時(shí)能夠自動(dòng)更新的情況

到了這里,關(guān)于笨蛋學(xué)設(shè)計(jì)模式行為型模式-觀察者模式【14】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 設(shè)計(jì)模式之觀察者模式【行為型模式】

    設(shè)計(jì)模式之觀察者模式【行為型模式】

    提示:文章寫完后,目錄可以自動(dòng)生成,如何生成可參考右邊的幫助文檔 學(xué)習(xí)的最大理由是想擺脫平庸,早一天就多一份人生的精彩;遲一天就多一天平庸的困擾。各位小伙伴,如果您: 想系統(tǒng)/深入學(xué)習(xí)某技術(shù)知識(shí)點(diǎn)… 一個(gè)人摸索學(xué)習(xí)很難堅(jiān)持,想組團(tuán)高效學(xué)習(xí)… 想寫博

    2024年02月03日
    瀏覽(21)
  • 行為型設(shè)計(jì)模式之觀察者模式【設(shè)計(jì)模式系列】

    行為型設(shè)計(jì)模式之觀察者模式【設(shè)計(jì)模式系列】

    C++技能系列 Linux通信架構(gòu)系列 C++高性能優(yōu)化編程系列 深入理解軟件架構(gòu)設(shè)計(jì)系列 高級(jí)C++并發(fā)線程編程 設(shè)計(jì)模式系列 期待你的關(guān)注哦?。。?現(xiàn)在的一切都是為將來的夢(mèng)想編織翅膀,讓夢(mèng)想在現(xiàn)實(shí)中展翅高飛。 Now everything is for the future of dream weaving wings, let the dream fly in reali

    2024年02月15日
    瀏覽(19)
  • c#設(shè)計(jì)模式-行為型模式 之 觀察者模式

    c#設(shè)計(jì)模式-行為型模式 之 觀察者模式

    又被稱為發(fā)布-訂閱(Publish/Subscribe)模式,它定義了一種一對(duì)多的依賴關(guān)系,讓多個(gè)觀察者 對(duì)象同時(shí)監(jiān)聽某一個(gè)主題對(duì)象。這個(gè)主題對(duì)象在狀態(tài)變化時(shí),會(huì)通知所有的觀察者對(duì)象,使他們能夠自 動(dòng)更新自己。 在觀察者模式中有如下角色: Subject:抽象主題(抽象被觀察者)

    2024年02月14日
    瀏覽(22)
  • C++設(shè)計(jì)模式行為型之觀察者模式

    一、 概述 ????????觀察者模式定義對(duì)象間的一種一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都得到通知并被自動(dòng)更新。 二、 示例代碼 #include list class Subject; class Observer { public: ?? ?virtual ~Observer(); ?? ?virtual void Update(Subject* theChangedSubject) =

    2024年02月14日
    瀏覽(27)
  • 深入理解設(shè)計(jì)模式-行為型之觀察者

    觀察者模式(Observer Pattern)是一種行為型設(shè)計(jì)模式,它定義了一種 一對(duì)多的依賴關(guān)系 ,讓 多個(gè)觀察者對(duì)象 同時(shí)監(jiān)聽一個(gè) 主題對(duì)象 ,當(dāng) 主題對(duì)象 發(fā)生 變化 時(shí),所有依賴于它的 觀察者 對(duì)象都會(huì)得到 通知并更新。 在觀察者模式中,有兩個(gè)主要角色: Subject(主題):維護(hù)

    2024年02月12日
    瀏覽(25)
  • 設(shè)計(jì)模式——觀察者模式

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

    觀察者模式可以分為觀察者和被觀察者,觀察者通過注冊(cè)到一個(gè)被觀察者中,也可視為訂閱,當(dāng)被觀察者的數(shù)據(jù)發(fā)生改變時(shí),會(huì)通知到觀察者,觀察者可以據(jù)此做出反應(yīng)。 可以類比訂閱報(bào)紙,報(bào)社就是被觀察者,訂閱者就是觀察者,訂閱者通過訂閱報(bào)紙與報(bào)社建立聯(lián)系,而報(bào)

    2024年02月15日
    瀏覽(18)
  • 【設(shè)計(jì)模式】觀察者模式

    【設(shè)計(jì)模式】觀察者模式

    觀察者模式(又被稱為發(fā)布-訂閱(Publish/Subscribe)模式,屬于行為型模式的一種,它定義了一種一對(duì)多的依賴關(guān)系,讓多個(gè)觀察者對(duì)象同時(shí)監(jiān)聽某一個(gè)主題對(duì)象。這個(gè)主題對(duì)象在狀態(tài)變化時(shí),會(huì)通知所有的觀察者對(duì)象,使他們能夠自動(dòng)更新自己。 Subject:抽象主題(被觀察者

    2024年02月13日
    瀏覽(20)
  • 設(shè)計(jì)模式---觀察者模式

    1,概念 ????????屬于行為模式的一種,定義了一種一對(duì)多的依賴關(guān)系,讓多個(gè)觀察者對(duì)象同時(shí)監(jiān)聽某一對(duì)象主題對(duì)象,這個(gè)主題對(duì)象在狀態(tài)變化時(shí),會(huì)通知所有的觀察者對(duì)象,使他們能夠自動(dòng)更新自己。 在觀察者模式中有如下角色: Subject:抽象主題(抽象被觀察者),

    2024年02月15日
    瀏覽(18)
  • 設(shè)計(jì)模式-觀察者模式

    觀察者模式是一種行為型設(shè)計(jì)模式,它定義了一種一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),其所有依賴者都會(huì)收到通知并自動(dòng)更新。當(dāng)對(duì)象間存在一對(duì)多關(guān)系時(shí),則使用觀察者模式(Observer Pattern)。比如,當(dāng)一個(gè)對(duì)象被修改時(shí),則會(huì)自動(dòng)通知依賴它的對(duì)象。觀察者

    2024年02月15日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包