用C++11打造智能觀察者模式:詳解實(shí)現(xiàn)步驟完整示例代碼
觀察者模式是一種行為設(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í)如何通知觀察者,以及如何移除觀察者。