青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

積木

No sub title

  C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
  140 Posts :: 1 Stories :: 11 Comments :: 0 Trackbacks

常用鏈接

留言簿(1)

我參與的團(tuán)隊(duì)

搜索

  •  

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

轉(zhuǎn)載自:http://patmusing.blog.163.com/blog/static/13583496020101501923571/


也稱為
DependentsPublish-Subscribe模式。

定義對(duì)象間的一種一對(duì)多的依賴關(guān)系,以便當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí),所有依賴于它的對(duì)象都得到通知并自動(dòng)更新。

“Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically.” – GoF

將一個(gè)系統(tǒng)分解成一系列的相互協(xié)作的類會(huì)產(chǎn)生一個(gè)普遍存在的副作用:需要維護(hù)相關(guān)對(duì)象之間的一致性。要維護(hù)各對(duì)象之間的一致性,通常的做法就是使這些對(duì)象之間彼此緊耦合,但是這樣又會(huì)降低他們的可重用性。

比如,許多圖形界面工具包將用戶界面的展示和底層應(yīng)用數(shù)據(jù)分開。用來定義應(yīng)用數(shù)據(jù)和界面展示的類可以獨(dú)立重復(fù)使用,也可以一起使用。表格對(duì)象和柱狀圖對(duì)象可以同時(shí)展示同一個(gè)應(yīng)用數(shù)據(jù)對(duì)象中的數(shù)據(jù),但表格對(duì)象和柱狀圖對(duì)象,彼此無需知道對(duì)方的存在。但實(shí)際情況中,它們卻似乎又知道對(duì)方的存在,比如當(dāng)一個(gè)用戶改動(dòng)表格中的信息,柱狀圖也會(huì)隨之改變,反之亦然。

22. C++實(shí)現(xiàn)Behavioral - Observer模式 - 玄機(jī)逸士 - 玄機(jī)逸士博客

這種行為暗示了表格對(duì)象和柱狀圖對(duì)象都依賴了數(shù)據(jù)對(duì)象。如果一個(gè)用戶改變了表格中的數(shù)據(jù),這種改動(dòng)會(huì)立即被反映到數(shù)據(jù)對(duì)象中,數(shù)據(jù)對(duì)象中的數(shù)據(jù)發(fā)生了這種改變,會(huì)立即通知柱狀圖對(duì)象,柱狀圖對(duì)象得到通知后,會(huì)對(duì)柱狀圖的顯示做出相應(yīng)的改變。

Observer模式描述如何建立這些關(guān)系。本模式中的關(guān)鍵對(duì)象是SubjectObserver。一個(gè)Subject可以有任意多獨(dú)立的Observer。如果Subject的內(nèi)容發(fā)生改變,所有的Observer都會(huì)得到通知,每個(gè)Observer則查詢Subject,以保持與其狀態(tài)同步。

這種交互也稱為publish-subscribe(發(fā)布者-注冊(cè))Subject就是publisher,任意數(shù)量的Observer可以注冊(cè)以接收通知。

UML類圖:

22. C++實(shí)現(xiàn)Behavioral - Observer模式 - 玄機(jī)逸士 - 玄機(jī)逸士博客

業(yè)務(wù)案例:

22. C++實(shí)現(xiàn)Behavioral - Observer模式 - 玄機(jī)逸士 - 玄機(jī)逸士博客

說明:

- 通過ATMInternetBankingServiceMobileBankingService均可改動(dòng)銀行賬戶余額;

- 銀行賬戶余額還可以有其他方式改變,比如柜臺(tái)(此例并未用及,用來模擬銀行賬戶自身的余額變化)

- 只要一上其中之一改變了銀行賬戶中的余額,其他相關(guān)各方均可以收到余額變動(dòng)信息;

- Bank AccountSubjectATMInternetBankingServiceMobileBankingServiceObserver

C++實(shí)現(xiàn)上述業(yè)務(wù)案例的代碼如下:

// Observer.h

#include <iostream>

#include <vector>

using namespace std;

class Observer;

//Account抽象類,用做接口

class Account

{

protected:

vector<Observer *> observers; // 保存若干個(gè)Observer

double balance; // 賬戶余額

public:

virtual void add_observer(Observer *o) = 0; // 注冊(cè)一個(gè)Observer

virtual void remove_observer(Observer *o) = 0; // 刪除一個(gè)Observer

virtual void notify_observer() = 0; // 通知所有注冊(cè)了的Observer

virtual void set_balance(double balance) = 0; // 改動(dòng)賬戶余額

virtual double get_balance() = 0; // 獲取賬戶月娥

public:

virtual ~Account()

{

cout << "in the destructor of Account..." << endl;

}

};

// Observer抽象類,用做接口

class Observer

{

protected:

Account *account; // 賬戶

public:

Observer(Account *account):account(account) // 構(gòu)造函數(shù)

{

}

virtual void handle_event() = 0; // 事件處理

virtual void set_account_balance(double balance) = 0; // 改動(dòng)賬戶余額

virtual ~Observer()

{

cout << "in the destructor of Observer..." << endl;

}

};

// BankAccout具體類,繼承Account抽象類

class BankAccount : public Account

{

public:

~BankAccount()

{

cout << "in the destructor of BankAccount..." << endl;

}

public:

void add_observer(Observer *o)

{

observers.push_back(o);

}

void remove_observer(Observer *o)

{

for(vector<Observer *>::iterator it = observers.begin(); it != observers.end(); it++)

{

if(o == *it) // 注意*it就是observers中的元素,其類型為Observer *

{

observers.erase(it); // 這里需要注意,oobservers中被刪除,但并未從內(nèi)存中刪除

return;

}

}

}

void notify_observer() // observers中的所有Observer發(fā)出通知,并進(jìn)行相關(guān)處理

{

for(vector<Observer *>::const_iterator it = observers.begin(); it != observers.end(); it++)

{

(*it)->handle_event();

}

}

void set_balance(double balance)

{

this->balance = balance;

notify_observer(); // 只要余額變動(dòng),就向所有注冊(cè)了的Observer發(fā)出通知

}

double get_balance()

{

return balance;

}

};

class ATM : public Observer

{

public:

ATM(Account *account):Observer(account) // account傳遞給基類Observer的構(gòu)造函數(shù)

{

}

~ATM()

{

cout << "in the destructor of Observer..." << endl;

}

public:

void handle_event()

{

cout << "ATM: The balance of bank account is changed to: " << account->get_balance() << endl;

}

void set_account_balance(double balance) // ATM中改動(dòng)銀行賬戶余額,比如在ATM機(jī)上存取款

{

account->set_balance(balance);

}

};

class InternetBankingService : public Observer

{

public:

InternetBankingService(Account *account):Observer(account) // account傳遞給基類Observer的構(gòu)造函數(shù)

{

}

~InternetBankingService()

{

cout << "in the destructor InternetBankingService..." << endl;

}

public:

void handle_event()

{

cout << "IBS: The balance of bank account is changed to: " << account->get_balance() << endl;

}

void set_account_balance(double balance) // 網(wǎng)上銀行改動(dòng)銀行賬戶余額,比如通過網(wǎng)上銀行轉(zhuǎn)賬

{

account->set_balance(balance);

}

};

class MobileBankingService : public Observer

{

public:

MobileBankingService(Account *account):Observer(account) // account傳遞給基類Observer的構(gòu)造函數(shù)

{

}

~MobileBankingService()

{

cout << "in the destructor of MobileBankingService..." << endl;

}

public:

void handle_event()

{

cout << "MBS: The balance of bank account is changed to: " << account->get_balance() << endl;

}

void set_account_balance(double balance) // 手機(jī)銀行改動(dòng)銀行賬戶余額,比如通過網(wǎng)上銀行轉(zhuǎn)賬

{

account->set_balance(balance);

}

};

// Observer.cpp

#include "Observer.h"

int main(int argc, char **argv)

{

Account *account = new BankAccount();

Observer *atm_observer = new ATM(account);

Observer *ibs_observer = new InternetBankingService(account);

Observer *mbs_observer = new MobileBankingService(account);

// 注冊(cè)Observer

account->add_observer(atm_observer);

account->add_observer(ibs_observer);

account->add_observer(mbs_observer);

// 銀行賬戶余額變動(dòng)(比如在柜臺(tái)存取款)

account->set_balance(1000.12);

// ATM機(jī)觸發(fā)銀行賬戶余額變動(dòng)

cout << "\nEvent triggered by atm_observer: " << endl;

cout << "================================" << endl;

atm_observer->set_account_balance(1000.23);

// 網(wǎng)上銀行觸發(fā)銀行賬戶余額變動(dòng)

cout << "\nEvent triggered by ibs_observer: " << endl;

cout << "================================" << endl;

ibs_observer->set_account_balance(1000.36);

// 手機(jī)銀行觸發(fā)銀行賬戶余額變動(dòng)

cout << "\nEvent triggered by mbs_observer: " << endl;

cout << "================================" << endl;

mbs_observer->set_account_balance(1000.68);

// 刪除(unsubscribe)網(wǎng)上銀行Observer,并變動(dòng)銀行賬戶余額

cout << "\nRemove ibs_observer: " << endl;

cout << "====================" << endl;

account->remove_observer(ibs_observer);

account->set_balance(2000.23);

cout << "\nDestroy all dynamically created objects: " << endl;

cout << "========================================" << endl;

delete account;

delete atm_observer;

delete ibs_observer;

delete mbs_observer;

}

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

ATM: The balance of bank account is changed to: 1000.12

IBS: The balance of bank account is changed to: 1000.12

MBS: The balance of bank account is changed to: 1000.12

Event triggered by atm_observer:

================================

ATM: The balance of bank account is changed to: 1000.23

IBS: The balance of bank account is changed to: 1000.23

MBS: The balance of bank account is changed to: 1000.23

Event triggered by ibs_observer:

================================

ATM: The balance of bank account is changed to: 1000.36

IBS: The balance of bank account is changed to: 1000.36

MBS: The balance of bank account is changed to: 1000.36

Event triggered by mbs_observer:

================================

ATM: The balance of bank account is changed to: 1000.68

IBS: The balance of bank account is changed to: 1000.68

MBS: The balance of bank account is changed to: 1000.68

Remove ibs_observer:

====================

ATM: The balance of bank account is changed to: 2000.23

MBS: The balance of bank account is changed to: 2000.23

Destroy all dynamically created objects:

========================================

in the destructor of BankAccount...

in the destructor of Account...

in the destructor of Observer...

in the destructor of Observer...

in the destructor InternetBankingService...

in the destructor of Observer...

in the destructor of MobileBankingService...

in the destructor of Observer...

Observer設(shè)計(jì)模式和Mediator設(shè)計(jì)模式的主要區(qū)別

Observer設(shè)計(jì)模式:某個(gè)特定的對(duì)象(subject或者observable)的狀態(tài)發(fā)生改變時(shí),其他對(duì)象(observers)將做出相應(yīng)的反應(yīng)。

Mediator設(shè)計(jì)模式:任何對(duì)象的狀態(tài)發(fā)生變化,其他對(duì)象都將做出相應(yīng)的反應(yīng),中間是通過Mediator來進(jìn)行協(xié)調(diào)的。

Observer設(shè)計(jì)模式有一個(gè)實(shí)際意義上的中心Mediator設(shè)計(jì)模式?jīng)]有實(shí)際意義上的中心,相對(duì)而言更分布式一些,其邏輯上的中心是由于純?cè)O(shè)計(jì)上的需要而引入的“Mediator”,即Observer模式中,事件源在subjectobservable對(duì)象;在Mediator模式中,事件源在除Mediator之外的其他所有對(duì)象。

關(guān)于在STL容器中保存對(duì)象指針的情況,詳見:

http://patmusing.blog.163.com/blog/static/13583496020101831514657/



posted on 2013-03-08 15:12 Jacc.Kim 閱讀(266) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 設(shè)計(jì)模式
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲欧美国产日韩中文字幕| 亚洲欧美激情四射在线日| 亚洲精品乱码| 亚洲九九爱视频| 亚洲免费成人av电影| aa成人免费视频| 亚洲素人在线| 欧美一区二区三区精品| 久久国产日本精品| 麻豆91精品91久久久的内涵| 欧美va天堂在线| 欧美日韩妖精视频| 国产精品久久久久久久9999| 国产欧美日韩麻豆91| 国产综合一区二区| 亚洲国产精品成人综合色在线婷婷| 亚洲国产综合91精品麻豆| 99re6这里只有精品| 亚洲一区三区电影在线观看| 性色一区二区| 欧美成人免费一级人片100| 亚洲激情中文1区| 亚洲午夜久久久久久尤物| 欧美在线啊v| 欧美韩国日本一区| 国产精品网站在线播放| 亚洲第一网站免费视频| 99国产一区二区三精品乱码| 新67194成人永久网站| 免费视频一区二区三区在线观看| 最近中文字幕日韩精品| 亚洲欧美精品在线观看| 免费视频亚洲| 国产精品美腿一区在线看| 影音先锋久久精品| 亚洲私人黄色宅男| 久久网站免费| 日韩视频在线播放| 久久riav二区三区| 欧美日本一道本在线视频| 国产视频一区在线观看| 亚洲三级影院| 久久精品91久久香蕉加勒比| 91久久精品一区| 久久爱91午夜羞羞| 欧美黑人在线观看| 国产一区亚洲一区| 亚洲小说欧美另类婷婷| 老鸭窝毛片一区二区三区| av成人毛片| 老司机一区二区| 国产精品一页| 一二三区精品福利视频| 久久中文欧美| 亚洲一线二线三线久久久| 欧美超级免费视 在线| 国产美女扒开尿口久久久| 亚洲免费观看高清在线观看| 快she精品国产999| 亚洲一区在线播放| 欧美久久影院| 亚洲国产精品成人一区二区| 久久精品视频播放| 一区二区三区你懂的| 欧美大色视频| 伊人婷婷欧美激情| 久久国产直播| 亚洲午夜精品网| 欧美日韩精品欧美日韩精品| 亚洲国产精品国自产拍av秋霞| 久久精品人人做人人爽电影蜜月| 亚洲视频免费看| 欧美日韩国产va另类| 亚洲国产一区在线| 欧美 日韩 国产在线| 久久成人久久爱| 国产一级久久| 久久丁香综合五月国产三级网站| 一区二区三区你懂的| 欧美日本不卡视频| 亚洲精品在线二区| 亚洲国产精品嫩草影院| 久久阴道视频| 激情五月***国产精品| 久久青草欧美一区二区三区| 欧美一级电影久久| 国产亚洲精品bv在线观看| 欧美怡红院视频一区二区三区| 中文一区二区| 国产精品久久久久久久久婷婷| 中文国产成人精品| 99一区二区| 国产精品电影网站| 亚洲欧美一级二级三级| 亚洲一区二区三区乱码aⅴ蜜桃女| 欧美日韩在线一区| 亚洲欧美国产高清va在线播| 在线亚洲一区| 国产精品揄拍500视频| 欧美一级二区| 欧美一区二区三区四区在线观看| 国产欧美在线播放| 久久亚洲国产精品日日av夜夜| 久久久999| 伊人成年综合电影网| 欧美第一黄网免费网站| 欧美大秀在线观看 | 亚洲欧美日本伦理| 亚洲无毛电影| 国产亚洲成年网址在线观看| 久久久久久久成人| 久久天天狠狠| 亚洲精品影视| 一本色道久久综合精品竹菊| 国产精品人人爽人人做我的可爱 | 欧美成人国产va精品日本一级| 久久综合久久久| 日韩午夜av| 亚洲一区二区三区四区五区黄| 国产精品一二三视频| 久久综合成人精品亚洲另类欧美| 狼人天天伊人久久| 在线亚洲免费视频| 亚洲欧美一区二区三区极速播放 | 欧美亚洲视频| 在线精品国产欧美| 亚洲欧洲一区二区三区| 国产精品女人久久久久久| 久久久久国产精品www | 91久久久亚洲精品| 99精品视频免费全部在线| 国产欧美一区二区色老头| 免费av成人在线| 欧美日韩国产影片| 久久久久久久一区二区| 欧美成人一品| 欧美在线影院在线视频| 麻豆av一区二区三区久久| 亚洲无限乱码一二三四麻| 久久www成人_看片免费不卡| 99国产一区二区三精品乱码| 欧美亚洲自偷自偷| 99re6热在线精品视频播放速度 | 亚洲人成啪啪网站| 国产日韩在线视频| 91久久线看在观草草青青| 国产精品一区二区你懂得| 亚洲丶国产丶欧美一区二区三区 | 亚洲一区网站| 久久久伊人欧美| 亚洲性线免费观看视频成熟| 久久久7777| 亚洲欧美文学| 欧美国产综合视频| 久久天天躁狠狠躁夜夜av| 欧美日韩另类视频| 能在线观看的日韩av| 国产精品色在线| 最近中文字幕日韩精品| 国内精品一区二区| 亚洲视频在线一区| 亚洲精品一区中文| 久久久91精品国产| 欧美一区二区视频97| 欧美精品综合| 欧美a级片一区| 国产日韩欧美综合| 日韩午夜在线视频| 亚洲精品乱码久久久久久蜜桃麻豆| 亚洲欧美日韩人成在线播放| 在线性视频日韩欧美| 免费毛片一区二区三区久久久| 久久久久久9| 国产精品视频观看| 99精品国产在热久久婷婷| 亚洲人成小说网站色在线| 久久高清免费观看| 久久99伊人| 国产精品美女久久久浪潮软件| 亚洲欧洲日韩综合二区| 亚洲国产欧美不卡在线观看| 久久疯狂做爰流白浆xx| 欧美在线看片a免费观看| 国产精品久久久999| 亚洲精品麻豆| 亚洲精品中文字幕有码专区| 久久综合给合| 老鸭窝亚洲一区二区三区| 国产亚洲激情视频在线| 亚洲欧美日韩一区二区在线 | 亚洲欧美激情诱惑| 亚洲欧美国产高清| 国产精品久久久久9999| 一区二区三区视频观看| 中国成人亚色综合网站| 欧美日韩大片| 日韩视频中午一区| 国产精品99久久久久久久久| 欧美日韩免费视频| 99热在线精品观看|