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

用C++11打造智能觀察者模式:詳解實(shí)現(xiàn)步驟完整示例代碼

開發(fā) 后端
觀察者模式是一種行為設(shè)計(jì)模式,其中一個(gè)對(duì)象(主題)維護(hù)其依賴對(duì)象(觀察者)的列表,當(dāng)主題的狀態(tài)發(fā)生變化時(shí),它通知所有觀察者。

觀察者模式是一種行為設(shè)計(jì)模式,其中一個(gè)對(duì)象(主題)維護(hù)其依賴對(duì)象(觀察者)的列表,當(dāng)主題的狀態(tài)發(fā)生變化時(shí),它通知所有觀察者。以下是一個(gè)使用C++11實(shí)現(xiàn)觀察者模式的簡(jiǎn)單例子:

  • 定義觀察者接口(Observer): 創(chuàng)建一個(gè)觀察者接口,該接口包含觀察者需要實(shí)現(xiàn)的更新方法。這個(gè)接口可以包含其他方法,但更新方法是必須的。
  • 創(chuàng)建具體觀察者類: 實(shí)現(xiàn)觀察者接口的具體類。每個(gè)具體觀察者類都應(yīng)該實(shí)現(xiàn)更新方法,該方法定義了在主題狀態(tài)變化時(shí)觀察者應(yīng)該執(zhí)行的操作。
  • 定義主題接口(Subject): 創(chuàng)建一個(gè)主題接口,該接口包含了添加、移除和通知觀察者的方法。這里可以選擇在主題接口中定義更新狀態(tài)的方法,也可以在具體主題類中定義。
  • 創(chuàng)建具體主題類: 實(shí)現(xiàn)主題接口的具體類。該類應(yīng)該維護(hù)一個(gè)觀察者列表,并在狀態(tài)變化時(shí)通知所有觀察者。
  • 實(shí)現(xiàn)客戶端代碼: 在客戶端代碼中創(chuàng)建具體的主題和觀察者對(duì)象,將觀察者添加到主題中??蛻舳诉€負(fù)責(zé)觸發(fā)主題狀態(tài)的變化,從而通知觀察者。

下面是對(duì)上述步驟的更詳細(xì)的講解:

步驟 1:定義觀察者接口

// Observer.h
#pragma once

class Observer {
public:
    virtual void update(int data) = 0;
};

步驟 2:創(chuàng)建具體觀察者類

// ConcreteObserverA.h
#pragma once
#include <iostream>
#include "Observer.h"

class ConcreteObserverA : public Observer {
public:
    void update(int data) override {
        std::cout << "Observer A 收到更新,數(shù)據(jù)為: " << data << std::endl;
    }
};
// ConcreteObserverB.h
#pragma once
#include <iostream>
#include "Observer.h"

class ConcreteObserverB : public Observer {
public:
    void update(int data) override {
        std::cout << "Observer B 收到更新,數(shù)據(jù)為: " << data << std::endl;
    }
};

步驟 3:定義主題接口

// Subject.h
#pragma once
#include "Observer.h"

class Subject {
public:
    virtual void addObserver(Observer* observer) = 0;
    virtual void removeObserver(Observer* observer) = 0;
    virtual void notifyObservers(int data) = 0;
};

步驟 4:創(chuàng)建具體主題類

// ConcreteSubject.h
#pragma once
#include <vector>
#include "Subject.h"

class ConcreteSubject : public Subject {
private:
    std::vector<Observer*> observers;
    int data;

public:
    void addObserver(Observer* observer) override {
        observers.push_back(observer);
    }

    void removeObserver(Observer* observer) override {
        observers.erase(std::remove(observers.begin(), observers.end(), observer), observers.end());
    }

    void notifyObservers(int data) override {
        for (Observer* observer : observers) {
            observer->update(data);
        }
    }

    void setData(int newData) {
        data = newData;
        notifyObservers(data);
    }

    int getData() const {
        return data;
    }
};

步驟 5:實(shí)現(xiàn)客戶端代碼

// main.cpp
#include "ConcreteObserverA.h"
#include "ConcreteObserverB.h"
#include "ConcreteSubject.h"

int main() {
    ConcreteSubject subject;
    ConcreteObserverA observerA;
    ConcreteObserverB observerB;

    subject.addObserver(&observerA);
    subject.addObserver(&observerB);

    subject.setData(123);

    subject.removeObserver(&observerA);

    subject.setData(456);

    return 0;
}

在這個(gè)例子中,我們創(chuàng)建了抽象觀察者類 Observer,具體觀察者類 ConcreteObserverA  ConcreteObserverB。然后,我們定義了抽象主題類 Subject 和具體主題類 ConcreteSubject。最后,在客戶端代碼中,我們創(chuàng)建了具體的主題和觀察者對(duì)象,將觀察者添加到主題中,并演示了狀態(tài)變化時(shí)如何通知觀察者,以及如何移除觀察者。

責(zé)任編輯:姜華 來源: 今日頭條
相關(guān)推薦

2020-10-26 08:45:39

觀察者模式

2021-07-08 11:28:43

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

2013-11-26 17:09:57

Android設(shè)計(jì)模式

2024-06-04 13:11:52

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

2021-09-06 10:04:47

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

2022-01-29 22:12:35

前端模式觀察者

2021-09-29 19:45:24

觀察者模式Observable

2011-04-29 09:22:22

2012-08-27 10:52:20

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

2021-03-29 07:14:28

Spring觀察者模式

2015-11-25 11:10:45

Javascript設(shè)計(jì)觀察

2024-02-18 12:36:09

2024-12-03 09:34:35

觀察者模 式編程Javav

2022-07-13 08:36:57

MQ架構(gòu)設(shè)計(jì)模式

2009-03-30 09:39:04

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

2021-06-03 12:26:28

觀察者模式面試阿里P6

2021-01-25 05:38:04

設(shè)計(jì)原理VueSubject

2021-03-30 15:30:44

鴻蒙HarmonyOS應(yīng)用開發(fā)

2022-05-09 10:50:13

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

2011-11-21 14:21:56

HTML 5
點(diǎn)贊
收藏

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