欧美vvv,亚洲第一成人在线,亚洲成人欧美日韩在线观看,日本猛少妇猛色XXXXX猛叫

新聞資訊

    設計模式_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圖,一個對象的改變會影響其他對象。

    一個抽象模型有兩個方面,其中一個依賴于另一個方面時。

    設計模式概述;

    返回設計模式概述

網站首頁   |    關于我們   |    公司新聞   |    產品方案   |    用戶案例   |    售后服務   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

地址:北京市海淀區    電話:010-     郵箱:@126.com

備案號:冀ICP備2024067069號-3 北京科技有限公司版權所有