自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

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

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

1. 觀察者模式是什么?

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

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

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

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

3. 工作流程

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

  • 注冊觀察者:觀察者通過調用主題的注冊方法(如 attach())將自己注冊到主題中。
  • 狀態(tài)改變:主題的狀態(tài)或數(shù)據發(fā)生變化(例如,屬性值改變)。
  • 通知觀察者:主題執(zhí)行通知方法(如 notify()),遍歷所有注冊的觀察者。調用每個觀察者的更新方法(如 update()),并傳遞必要的數(shù)據。
  • 觀察者更新:觀察者接收到通知后,根據主題的當前狀態(tài)進行相應的處理(如更新自己的狀態(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");
    }
}

代碼詳細解析

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

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

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

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

(3) 通知機制:

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

4. 優(yōu)缺點

(1) 優(yōu)點

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

(2) 缺點

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

5. 總結

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

責任編輯:趙寧寧 來源: 猿javav
相關推薦

2021-09-06 10:04:47

觀察者模式應用

2020-10-26 08:45:39

觀察者模式

2021-07-08 11:28:43

觀察者模式設計

2013-11-26 17:09:57

Android設計模式

2022-01-29 22:12:35

前端模式觀察者

2011-04-29 09:22:22

2012-08-27 10:52:20

.NET架構觀察者模式

2021-03-29 07:14:28

Spring觀察者模式

2022-12-29 10:16:12

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

2015-11-25 11:10:45

Javascript設計觀察

2024-02-18 12:36:09

2009-03-30 09:39:04

觀察者思想換位設計模式

2024-06-04 13:11:52

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

2021-01-25 05:38:04

設計原理VueSubject

2021-06-03 12:26:28

觀察者模式面試阿里P6

2022-11-15 07:35:50

Spring事件觀察者模式

2021-09-29 19:45:24

觀察者模式Observable

2015-03-17 10:13:52

HTML5什么鬼

2022-07-13 08:36:57

MQ架構設計模式

2022-05-09 10:50:13

觀察者模式設計模式
點贊
收藏

51CTO技術棧公眾號