国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C++之觀察者模式(發(fā)布-訂閱)

這篇具有很好參考價(jià)值的文章主要介紹了C++之觀察者模式(發(fā)布-訂閱)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

目錄

模式簡(jiǎn)介

介紹

優(yōu)點(diǎn)

缺點(diǎn)

代碼實(shí)現(xiàn)

場(chǎng)景說(shuō)明

實(shí)現(xiàn)代碼

運(yùn)行結(jié)果


模式簡(jiǎn)介

觀察者模式(Observer Pattern,也叫我們熟知的發(fā)布-訂閱模式。
它是一種行為型模式。

介紹

觀察者模式主要關(guān)注的是對(duì)象的一對(duì)多的關(guān)系,
也就是多個(gè)對(duì)象依賴于一個(gè)對(duì)象,當(dāng)該對(duì)象的狀態(tài)發(fā)生改變時(shí),其他對(duì)象都能夠收到相應(yīng)的通知

意圖:
定義對(duì)象間的一種一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都得到通知并被自動(dòng)更新。
主要解決:
一個(gè)對(duì)象狀態(tài)改變給其他對(duì)象通知的問(wèn)題,而且要考慮到易用和低耦合,保證高度的協(xié)作。
如何解決:
使用面向?qū)ο蠹夹g(shù),可以將這種關(guān)系弱化。

優(yōu)點(diǎn)

  1. 觀察者和被觀察者是抽象耦合的;
  2. 建立了一套觸發(fā)機(jī)制。

缺點(diǎn)

  1. 如果一個(gè)被觀察者對(duì)象有很多的直接和間接的觀察者的話,通知所有的觀察者需要花費(fèi)很長(zhǎng)的時(shí)間;
  2. 如果在觀察者和被觀察者目標(biāo)之間有循環(huán)依賴的話,觀察目標(biāo)會(huì)觸發(fā)他們之間的循環(huán)調(diào)用,可能會(huì)導(dǎo)致系統(tǒng)崩潰;
  3. 觀察者模式?jīng)]有相應(yīng)的機(jī)制讓觀察者知道所觀察的目標(biāo)對(duì)象是怎么發(fā)生變化的,而僅僅是知道觀察目標(biāo)發(fā)生了變化。

代碼實(shí)現(xiàn)

場(chǎng)景說(shuō)明

我們現(xiàn)在有三個(gè)觀察者三種消息,這三個(gè)觀察者分別對(duì)不同的消息感興趣

我們實(shí)現(xiàn)的話,可以簡(jiǎn)單的設(shè)置三個(gè)觀察者,一個(gè)主題類(lèi)(被觀察者)。
這三個(gè)觀察者可以設(shè)置自己喜歡的、感興趣的消息類(lèi)型(1、2、3)。
他們處理收到的消息就是打印一下自己收到了什么消息。
具體實(shí)現(xiàn)如下

實(shí)現(xiàn)代碼

/*

observer1 observer2 observer3

		Subject (主題)主題更改,應(yīng)該及時(shí)通知相應(yīng)的觀察者,去處理相應(yīng)的事件
*/
class Observer // 觀察者抽象類(lèi)
{
public:
	//處理消息的接口
	virtual void handle(int msgid) = 0;
};

//第一個(gè)觀察者實(shí)例
class Observer1 : public Observer
{
public:
	void handle(int msgid)
	{
		switch (msgid)
		{
		case 1:
			cout << "Observer1 recv 1 msg" << endl;
			break;
		case 2:
			cout << "Observer1 recv 2 msg" << endl;
			break;
		default:
			cout << "Observer1 recv unkonw msg!" << endl;
			break;
		}
	}
};
//第二個(gè)觀察者實(shí)例
class Observer2 : public Observer
{
public:
	void handle(int msgid)
	{
		switch (msgid)
		{
		case 2:
			cout << "Observer2 recv 2 msg" << endl;
			break;
		default:
			cout << "Observer2 recv unkonw msg!" << endl;
			break;
		}
	}
};
//第三個(gè)觀察者實(shí)例
class Observer3 : public Observer
{
public:
	void handle(int msgid)
	{
		switch (msgid)
		{
		case 1:
			cout << "Observer3 recv 1 msg" << endl;
			break;
		case 3:
			cout << "Observer3 recv 3 msg" << endl;
			break;
		default:
			cout << "Observer3 recv unkonw msg!" << endl;
			break;
		}
	}
};

//主題類(lèi)
class Subject
{
public:
	//給主題增加觀察者對(duì)象
	void addObserver(Observer* obser,int msgid)
	{
		_subMap[msgid].push_back(obser);
	}
	//主題檢測(cè)發(fā)生改變,通知相應(yīng)的觀察者對(duì)象處理事件
	void dispatch(int msgid)
	{
		auto it = _subMap.find(msgid);
		if (it != _subMap.end())
		{
			//通過(guò)多態(tài),實(shí)現(xiàn)不同的指向
			for (Observer* pObser : it->second)
			{
				pObser->handle(msgid);
			}
		}
	}
private:
	//用來(lái)保存訂閱的消息
	unordered_map<int, list<Observer*>> _subMap;
};

我們可以看到主題類(lèi)(Subject)的數(shù)據(jù)成員是一個(gè)unordered_map。使用這個(gè)是因?yàn)槲覀儾恍枰獢?shù)據(jù)是有序的,為了提高增刪查的速率,使用了無(wú)序map。
使用map的好處是,它作為一個(gè)鍵值對(duì),可以存儲(chǔ)我們想要的數(shù)據(jù)類(lèi)型:(消息類(lèi)型,訂閱此消息類(lèi)型的觀察者們)。

并且,在主題類(lèi)(Subject)的成員方法addObserver中,我們使用了一個(gè)中括號(hào)運(yùn)算符([])重載的特性:
如果當(dāng)前容器中存有相應(yīng)的msgid鍵的話,就直接添加對(duì)應(yīng)的值(Obser);
如果當(dāng)前容器中沒(méi)有相應(yīng)的msgid鍵的話,就直接添加該鍵,并且添加一個(gè)默認(rèn)的值。

運(yùn)行結(jié)果

我們使用如下的代碼:

void main()
{
	Subject subject;
	Observer* p1 = new Observer1();
	Observer* p2 = new Observer2();
	Observer* p3 = new Observer3();

	subject.addObserver(p1, 1);
	subject.addObserver(p1, 2);
	subject.addObserver(p2, 2);
	subject.addObserver(p3, 1);
	subject.addObserver(p3, 3);

	int msgid = 0;
	for (;;)
	{
		cout << "請(qǐng)輸入消息id:" << endl;
		cin >> msgid;
		if (msgid == -1)
			break;

		subject.dispatch(msgid);//發(fā)起通知
	}
}

運(yùn)行結(jié)果如下

?C++之觀察者模式(發(fā)布-訂閱),設(shè)計(jì)模式,C++,觀察者模式,c++文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-618691.html

到了這里,關(guān)于C++之觀察者模式(發(fā)布-訂閱)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 觀察者模式, 發(fā)布-訂閱模式, 監(jiān)聽(tīng)器模式

    觀察者模式, 發(fā)布-訂閱模式, 監(jiān)聽(tīng)器模式

    觀察者模式是一種 行為型 設(shè)計(jì)模式, 定義對(duì)象間的一種 一對(duì)多 的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都得到通知并被自動(dòng)更新 角色模型和結(jié)構(gòu)圖 在觀察者模式中,只有兩種主體:目標(biāo)對(duì)象 ( Object ) 和 觀察者 ( Observer )。宗門(mén)任務(wù)大殿就是目標(biāo)對(duì)象

    2024年02月22日
    瀏覽(88)
  • 觀察者模式、中介者模式和發(fā)布訂閱模式

    觀察者模式、中介者模式和發(fā)布訂閱模式

    觀察者模式定義了對(duì)象間的一種一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都將得到通知,并自動(dòng)更新 觀察者模式屬于行為型模式,行為型模式關(guān)注的是對(duì)象之間的通訊,觀察者模式就是觀察者和被觀察者之間的通訊 例如生活中,我們可以用報(bào)

    2024年02月15日
    瀏覽(88)
  • JavaScript 簡(jiǎn)單實(shí)現(xiàn)觀察者模式和發(fā)布-訂閱模式

    JavaScript 簡(jiǎn)單實(shí)現(xiàn)觀察者模式和發(fā)布-訂閱模式

    大家好,我是南木元元,熱衷分享有趣實(shí)用的文章。今天來(lái)聊聊設(shè)計(jì)模式中常用的觀察者模式和發(fā)布-訂閱模式。 觀察者模式定義對(duì)象間的一種一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都將得到通知。 如何理解這句話呢?來(lái)舉個(gè)生活中的例子

    2024年02月12日
    瀏覽(638)
  • 從Vue層面 - 解析發(fā)布訂閱模式和觀察者模式區(qū)別

    從Vue層面 - 解析發(fā)布訂閱模式和觀察者模式區(qū)別

    觀察者模式和發(fā)布訂閱模式作為日常開(kāi)發(fā)中經(jīng)常使用到的模式,我一直不能做到很好的區(qū)分。最近在看Vue的源碼,里面設(shè)計(jì)到了觀察者模式,比較感興趣,就去學(xué)習(xí)了下,這里做個(gè)總結(jié)吧。 基于一個(gè) 事件中心 ,接收通知的對(duì)象是訂閱者,需要先訂閱某個(gè)事件,觸發(fā)事件的對(duì)

    2024年02月15日
    瀏覽(89)
  • 【JavaScript】手撕前端面試題:寄生組合式繼承 | 發(fā)布訂閱模式 | 觀察者模式

    ?????個(gè)人簡(jiǎn)介:大三學(xué)生,一個(gè)不甘平庸的平凡人?? ??? NodeJS專(zhuān)欄:Node.js從入門(mén)到精通 ??? 博主的前端之路(源創(chuàng)征文一等獎(jiǎng)作品):前端之行,任重道遠(yuǎn)(來(lái)自大三學(xué)長(zhǎng)的萬(wàn)字自述) ??? TypeScript知識(shí)總結(jié):TypeScript從入門(mén)到精通(十萬(wàn)字超詳細(xì)知識(shí)點(diǎn)總結(jié)) ??

    2023年04月08日
    瀏覽(96)
  • 【C++ 觀察者模式 思想理解】C++中的觀察者模式:松耦合設(shè)計(jì)與動(dòng)態(tài)交互的藝術(shù),合理使用智能指針觀察者

    【C++ 觀察者模式 思想理解】C++中的觀察者模式:松耦合設(shè)計(jì)與動(dòng)態(tài)交互的藝術(shù),合理使用智能指針觀察者

    在進(jìn)入技術(shù)細(xì)節(jié)之前,理解觀察者模式(Observer Pattern)的基本概念和它在現(xiàn)代編程中的重要性是至關(guān)重要的。 觀察者模式是一種設(shè)計(jì)模式,它定義了對(duì)象間的一種一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都得到通知并自動(dòng)更新。在C++中,這個(gè)

    2024年01月24日
    瀏覽(48)
  • C++ 設(shè)計(jì)模式之觀察者模式

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

    【聲明】本題目來(lái)源于卡碼網(wǎng)(題目頁(yè)面 (kamacoder.com)) 【提示:如果不想看文字介紹,可以直接跳轉(zhuǎn)到C++編碼部分】 【設(shè)計(jì)模式大綱】 ?????????前面的文章介紹了創(chuàng)建型模式和結(jié)構(gòu)型模式,今天開(kāi)始介紹行為型模式。 【簡(jiǎn)介】什么是觀察者模式 (第13種模式) ????

    2024年01月16日
    瀏覽(23)
  • C++設(shè)計(jì)模式行為型之觀察者模式

    一、 概述 ????????觀察者模式定義對(duì)象間的一種一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都得到通知并被自動(dòng)更新。 二、 示例代碼 #include list class Subject; class Observer { public: ?? ?virtual ~Observer(); ?? ?virtual void Update(Subject* theChangedSubject) =

    2024年02月14日
    瀏覽(27)
  • 【設(shè)計(jì)模式】Head First 設(shè)計(jì)模式——觀察者模式 C++實(shí)現(xiàn)

    設(shè)計(jì)模式最大的作用就是在變化和穩(wěn)定中間尋找隔離點(diǎn),然后分離它們,從而管理變化。將變化像小兔子一樣關(guān)到籠子里,讓它在籠子里隨便跳,而不至于跳出來(lái)把你整個(gè)房間給污染掉。 主題對(duì)象(出版者)管理某些數(shù)據(jù),當(dāng)主題內(nèi)的數(shù)據(jù)改變,就會(huì)通知觀察者(訂閱者)。

    2024年02月10日
    瀏覽(27)
  • C++ 程序設(shè)計(jì):四大模式(工廠+裝飾+策略+觀察者)

    \\\"工廠+裝飾+策略+觀察者\(yùn)\\"是常見(jiàn)且常用的設(shè)計(jì)模式之一,但并不是指稱\\\"四大模式\\\"的官方術(shù)語(yǔ)。 \\\" 四大模式 \\\"通常是指指令式面向?qū)ο缶幊讨械乃膫€(gè)基本概念: 封裝 、 繼承 、 多態(tài) 和 抽象 。這四個(gè)概念是面向?qū)ο缶幊痰幕?工廠模式( 例:工廠方法模式 )中,通常存在

    2024年02月17日
    瀏覽(29)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包