成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

什么是觀察者模式?它觀察的是什么?

開發(fā) 后端
這篇文章我們將深入探討觀察者模式的定義、結(jié)構(gòu)、優(yōu)缺點、適用場景以及代碼實現(xiàn)等方面。

觀察者模式是計算機編程領(lǐng)域比較常見的一種模式,那么,什么是觀察者模式?它是如何工作的?這篇文章我們將深入探討觀察者模式的定義、結(jié)構(gòu)、優(yōu)缺點、適用場景以及代碼實現(xiàn)等方面。

1. 觀察者模式是什么?

觀察者設(shè)計模式(Observer Pattern)是一種行為型設(shè)計模式,它定義了一種一對多的依賴關(guān)系,讓多個觀察者對象同時監(jiān)聽某一個主題對象。當(dāng)主題對象的狀態(tài)發(fā)生變化時,所有依賴于它的觀察者對象都會得到通知并自動更新。這種模式常用于事件處理系統(tǒng)。

2. 觀察者模式的組成部分

觀察者模式主要由以下幾個部分組成:

  • 主題(Subject):它是一個接口或者抽象類,定義了注冊、注銷和通知觀察者的方法。
  • 具體主題(Concrete Subject):具體主題類實現(xiàn)了主題接口,維護一個觀察者列表,當(dāng)自身狀態(tài)改變時,通知所有觀察者。
  • 觀察者(Observer):它是一個接口或者抽象類,定義了更新自身的方法。
  • 具體觀察者(Concrete Observer):具體觀察者類實現(xiàn)了觀察者接口,以便在接收到通知時自身狀態(tài)能與主題同步。

3. 工作流程

從整體上看,觀察者模式的工作流程包含如下步驟:

  • 注冊觀察者:觀察者通過調(diào)用主題的注冊方法(如 attach())將自己注冊到主題中。
  • 狀態(tài)改變:主題的狀態(tài)或數(shù)據(jù)發(fā)生變化(例如,屬性值改變)。
  • 通知觀察者:主題執(zhí)行通知方法(如 notify()),遍歷所有注冊的觀察者。調(diào)用每個觀察者的更新方法(如 update()),并傳遞必要的數(shù)據(jù)。
  • 觀察者更新:觀察者接收到通知后,根據(jù)主題的當(dāng)前狀態(tài)進行相應(yīng)的處理(如更新自己的狀態(tài)或執(zhí)行操作)。

為了更好地理解觀察者模式的工作原理,下面我們通過一個簡單的Java示例,演示如何實現(xiàn)觀察者模式。

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

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

// 具體觀察者
class ConcreteObserver implements Observer {
    private String name;

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

    @Override
    public void update(String message) {
        System.out.println(name + " received message: " + message);
    }
}

// 主題接口
interface Subject {
    void registerObserver(Observer observer);
    void removeObserver(Observer observer);
    void notifyObservers();
}

// 具體主題
class ConcreteSubject implements Subject {
    private List<Observer> observers = new ArrayList<>();
    private String message;

    @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(message);
        }
    }

    public void setMessage(String message) {
        this.message = message;
        notifyObservers();
    }
}

// 測試類
public class ObserverPatternDemo {
    public static void main(String[] args) {
        ConcreteSubject subject = new ConcreteSubject();

        Observer observer1 = new ConcreteObserver("Observer 1");
        Observer observer2 = new ConcreteObserver("Observer 2");

        subject.registerObserver(observer1);
        subject.registerObserver(observer2);

        subject.setMessage("Hello, Observers!");
        subject.setMessage("Another message");

        subject.removeObserver(observer1);
        subject.setMessage("Observer 1 should not receive this");
    }
}

代碼詳細(xì)解析

(1) 主題接口與具體主題:

  • Subject接口定義了注冊、移除和通知觀察者的方法。
  • ConcreteSubject實現(xiàn)了Subject接口,并維護一個觀察者列表。當(dāng)其狀態(tài)改變時,通過調(diào)用notifyObservers()方法通知所有觀察者。

(2) 觀察者接口與具體觀察者:

  • Observer接口定義了update方法,當(dāng)主題狀態(tài)改變時,主題會調(diào)用此方法。
  • ConcreteObserver實現(xiàn)了Observer接口,并在update方法中定義了當(dāng)收到通知時的具體行為。

(3) 通知機制:

  • 當(dāng)ConcreteSubject的狀態(tài)通過setMessage方法改變時,它會調(diào)用notifyObservers()方法,向所有的觀察者發(fā)送更新通知。
  • 觀察者通過實現(xiàn)update方法來處理這些通知。

4. 優(yōu)缺點

(1) 優(yōu)點

  • 松耦合:觀察者模式實現(xiàn)了對象之間的松耦合,觀察者和主題之間并不需要明確的依賴關(guān)系,只通過接口來交互。這使得系統(tǒng)更具擴展性。
  • 動態(tài)交互:可以在運行時添加或移除觀察者,靈活性強。這對于需要動態(tài)調(diào)整的程序非常有用。
  • 多種訂閱方式:不同的觀察者可以對同一主題訂閱不同的條件,以應(yīng)對復(fù)雜的業(yè)務(wù)邏輯。

(2) 缺點

  • 通知機制開銷:在主題狀態(tài)改變時,需要通知所有觀察者,這可能導(dǎo)致性能問題,尤其是在觀察者數(shù)量較多時。
  • 觀察者管理復(fù)雜:觀察者的管理可能會變得復(fù)雜,特別是在大量觀察者需要注銷的情況下,需要確保所有觀察者的狀態(tài)一致性。
  • 隱式依賴:雖然觀察者模式松耦合,但是觀察者和主題之間仍然存在隱式依賴關(guān)系,可能導(dǎo)致在系統(tǒng)分析和維護時的復(fù)雜性增加。

5. 總結(jié)

這篇文章,我們分析了觀察者模式以及實現(xiàn)的示例代碼,它是一種常用的設(shè)計模式,適用于需要對一個對象的狀態(tài)變化做出響應(yīng)的場景。通過使用觀察者模式,可以實現(xiàn)對象之間的松耦合,提高系統(tǒng)的靈活性和可維護性。

責(zé)任編輯:趙寧寧 來源: 猿javav
相關(guān)推薦

2020-10-26 08:45:39

觀察者模式

2021-09-06 10:04:47

觀察者模式應(yīng)用

2013-11-26 17:09:57

Android設(shè)計模式

2021-07-08 11:28:43

觀察者模式設(shè)計

2022-01-29 22:12:35

前端模式觀察者

2011-04-29 09:22:22

2012-08-27 10:52:20

.NET架構(gòu)觀察者模式

2021-03-29 07:14:28

Spring觀察者模式

2022-12-29 10:16:12

觀察性系統(tǒng)監(jiān)視

2024-02-18 12:36:09

2015-11-25 11:10:45

Javascript設(shè)計觀察

2009-03-30 09:39:04

觀察者思想換位設(shè)計模式

2021-01-25 05:38:04

設(shè)計原理VueSubject

2024-06-04 13:11:52

Python行為設(shè)計模式開發(fā)

2021-09-29 19:45:24

觀察者模式Observable

2021-06-03 12:26:28

觀察者模式面試阿里P6

2022-11-15 07:35:50

Spring事件觀察者模式

2015-03-17 10:13:52

HTML5什么鬼

2022-05-09 10:50:13

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

2022-07-13 08:36:57

MQ架構(gòu)設(shè)計模式
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 日韩欧美一区在线 | 精品不卡 | 久久高潮| 中文字幕亚洲视频 | 韩国电影久久 | 免费看片在线播放 | 欧美日韩亚 | 91久久精品国产免费一区 | 国产欧美日韩综合精品一区二区 | 日韩久久精品视频 | 精品九九九 | 亚洲国产一区二区三区在线观看 | 羞羞视频网站免费观看 | 亚洲视频在线观看免费 | 国产精品久久久久久久久久免费看 | 日韩中文字幕免费 | 国产美女在线免费观看 | 亚洲精品国产电影 | 久久亚洲一区二区 | 久久专区 | 91视视频在线观看入口直接观看 | 自拍视频国产 | 艹逼网 | a免费视频| 国产在线观看一区 | 自拍偷拍小视频 | 中文字幕国产视频 | 欧美日韩不卡 | 亚洲视频在线观看 | 国产成人久久精品 | 欧美精品v国产精品v日韩精品 | xnxx 日本免费 | 天天插天天操 | 在线一区 | www.成人.com | 久久精品国产亚洲一区二区三区 | av在线影院 | 国内自拍偷拍 | 亚洲精品久久久蜜桃 | 久久三级av | 亚洲三级免费看 |