設計模式_20 觀察者模式
20 觀察者模式 20.1 概念
又被稱為發布-訂閱模式,它定義了一種一對多的依賴關系,讓多個觀察者同時監聽某一主題對象。該主題對象在狀態變化時觀察者設計模式uml圖,會通知所有的觀察者對象,使他們能夠自動更新自己。
20.2 結構
抽象主題(抽象被觀察者)角色:把所有觀察者對象保存在一個集合里,每個主題都可以有任意數量的觀察者。抽象主題提供一個接口,可以增加和刪除對象。
具體主題(具體被觀察者)角色:將有關狀態存入具體觀察者對象。在具體主題的內部狀態發生改變時,給所有注冊過的觀察者發送通知。
抽象觀察者角色:觀察者的抽象類。定義了一個更新接口,使得在得到主題更改通知時更新自己。
具體觀察者角色:實現抽象觀察者定義的接口。在得到主題更改通知時更新自身狀態。
20.3 實現 20.3.1 UML圖
20.3.2 代碼
.h:
//ObserverAndSubject.h
#ifndef _OBSERVERANDSUBJECT_H_
#define _OBSERVERANDSUBJECT_H_
#include
#include
#include
using namespace std;
class Observer;
class Subject {
public:
virtual void addObserver(Observer* observer) = 0;
virtual void deleteObserver(Observer* observer) = 0;
virtual void send(string message) = 0;
};
class ConcreteSubject : public Subject {
private:
list<Observer*> observers;
public:
void addObserver(Observer* observer);
void deleteObserver(Observer* observer);
void send(string message);
};
class Observer {
public:
virtual void addSubject(Subject* subject) = 0;
virtual void deleteSubject(Subject* subject) = 0;
virtual void update(string message) = 0;
};
class ConcreteObserver : public Observer {
private:
string name;
list<Subject*> subjects;
public:
ConcreteObserver(string name);
void addSubject(Subject* subject);
void deleteSubject(Subject* subject);
void update(string message);
};
#endif
.cpp:
#include"ObserverAndSubject.h"
void ConcreteSubject::addObserver(Observer* observer) {
this->observers.push_back(observer);
}
void ConcreteSubject::deleteObserver(Observer* observer) {
this->observers.remove(observer);
}
void ConcreteSubject::send(string message) {
for (auto it : this->observers) {
it->update(message);
}
}
ConcreteObserver::ConcreteObserver(string name) {
this->name = name;
}
void ConcreteObserver::addSubject(Subject* subject) {
this->subjects.push_back(subject);
subject->addObserver(this);
}
void ConcreteObserver::deleteSubject(Subject* subject) {
this->subjects.remove(subject);
subject->deleteObserver(this);
}
void ConcreteObserver::update(string message) {
cout <<this->name <<' ' << message << endl;
}
main.cpp:
#include"ObserverAndSubject.h"
int main() {
Subject* subjectOne = new ConcreteSubject();
Subject* subjectTwo = new ConcreteSubject();
Observer* observerOne = new ConcreteObserver("number23");
Observer* observerTwo = new ConcreteObserver("17RuntimeError");
observerOne->addSubject(subjectOne);
observerTwo->addSubject(subjectOne);
observerTwo->addSubject(subjectTwo);
subjectOne->send("message One");
cout << endl;
subjectTwo->send("message Two");
cout << endl;
observerTwo->deleteSubject(subjectOne);
subjectOne->send("message Three");
cout << endl;
return 0;
}
20.4 優缺點 20.4.1 優點
降低了主題和觀察者之間的耦合關系,兩者為抽象耦合關系。
被觀察者發送通知,所有注冊的觀察者都會收到信息(廣播機制)。
20.4.2 缺點
觀察者非常多的時候,收到信息不完全同步。
如果被觀察者有循環依賴,會成環。
20.5 使用場景
對象間存在一對多的關系觀察者設計模式uml圖,一個對象的改變會影響其他對象。
一個抽象模型有兩個方面,其中一個依賴于另一個方面時。
設計模式概述;
返回設計模式概述