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

那誰的技術(shù)博客

感興趣領(lǐng)域:高性能服務器編程,存儲,算法,Linux內(nèi)核
隨筆 - 210, 文章 - 0, 評論 - 1183, 引用 - 0
數(shù)據(jù)加載中……

常見設計模式的解析和實現(xiàn)(C++)之十五-Observer模式

作用:
定義對象間的一種一對多的依賴關(guān)系,當一個對象的狀態(tài)發(fā)生改變時,所有依賴于它的對象都得到通知并被自動更新.

UML結(jié)構(gòu)圖:



解析:
Observer模式定義的是一種一對多的關(guān)系,這里的一就是圖中的Subject類,而多則是Obesrver類,當Subject類的狀態(tài)發(fā)生變化的時候通知與之對應的Obesrver類們也去相應的更新狀態(tài),同時支持動態(tài)的添加和刪除Observer對象的功能.Obesrver模式的實現(xiàn)要點是,第一一般subject類都是采用鏈表等容器來存放Observer對象,第二抽取出Observer對象的一些公共的屬性形成Observer基類,而Subject中保存的則是Observer類對象的指針,這樣就使Subject和具體的Observer實現(xiàn)了解耦,也就是Subject不需要去關(guān)心到底是哪個Observer對放進了自己的容器中.生活中有很多例子可以看做是Observer模式的運用,比方說,一個班有一個班主任(Subject),他管理手下的一幫學生(Observer),當班里有一些事情發(fā)生需要通知學生的時候,班主任要做的不是逐個學生挨個的通知而是把學生召集起來一起通知,實現(xiàn)了班主任和具體學生的關(guān)系解耦.

實現(xiàn):
1)Observer.h
/********************************************************************
????created:????2006/07/20
????filename:?????Observer.h
????author:????????李創(chuàng)
????????????????
http://m.shnenglu.com/converse/

????purpose:????Observer模式的演示代碼
********************************************************************
*/


#ifndef?OBSERVER_H
#define?OBSERVER_H

#include?
<list>

typedef?
int?STATE;

class?Observer;

//?Subject抽象基類,只需要知道Observer基類的聲明就可以了
class?Subject
{
public:
????Subject()?:?m_nSubjectState(
-1){}
????
virtual?~Subject();

????
void?Notify();????????????????????????????//?通知對象改變狀態(tài)
????void?Attach(Observer?*pObserver);????????//?新增對象
????void?Detach(Observer?*pObserver);????????//?刪除對象

????
//?虛函數(shù),提供默認的實現(xiàn),派生類可以自己實現(xiàn)來覆蓋基類的實現(xiàn)
????virtual?void????SetState(STATE?nState);????//?設置狀態(tài)
????virtual?STATE????GetState();????????//?得到狀態(tài)

protected:
????STATE?m_nSubjectState;????????????????????
//?模擬保存Subject狀態(tài)的變量
????std::list<Observer*>????m_ListObserver;????//?保存Observer指針的鏈表
}
;

//?Observer抽象基類
class?Observer
{
public:
????Observer()?:?m_nObserverState(
-1){}
????
virtual?~Observer(){}

????
//?純虛函數(shù),各個派生類可能有不同的實現(xiàn)
????
//?通知Observer狀態(tài)發(fā)生了變化
????virtual?void?Update(Subject*?pSubject)?=?0;

protected:
????STATE?m_nObserverState;????????????????????
//?模擬保存Observer狀態(tài)的變量
}
;

//?ConcreateSubject類,派生在Subject類
class?ConcreateSubject
????:?
public?Subject
{
public:
????ConcreateSubject()?:?Subject()
{}
????
virtual?~ConcreateSubject(){}

????
//?派生類自己實現(xiàn)來覆蓋基類的實現(xiàn)
????virtual?void????SetState(STATE?nState);????//?設置狀態(tài)
????virtual?STATE????GetState();????????//?得到狀態(tài)

}
;

//?ConcreateObserver類派生自Observer
class?ConcreateObserver
????:?
public?Observer
{
public:
????ConcreateObserver()?:?Observer()
{}
????
virtual?~ConcreateObserver(){}

????
//?虛函數(shù),實現(xiàn)基類提供的接口
????virtual?void?Update(Subject*?pSubject);
}
;

#endif

2)Observer.cpp
/********************************************************************
????created:????2006/07/20
????filename:?????Observer.cpp
????author:????????李創(chuàng)
????????????????
http://m.shnenglu.com/converse/

????purpose:????Observer模式的演示代碼
********************************************************************
*/


#include?
"Observer.h"
#include?
<iostream>
#include?
<algorithm>

/*?--------------------------------------------------------------------
|????Subject類成員函數(shù)的實現(xiàn)
|
?----------------------------------------------------------------------
*/


void?Subject::Attach(Observer?*pObserver)
{
????std::cout?
<<?"Attach?an?Observer\n";

????m_ListObserver.push_back(pObserver);
}


void?Subject::Detach(Observer?*pObserver)
{
????std::list
<Observer*>::iterator?iter;
????iter?
=?std::find(m_ListObserver.begin(),?m_ListObserver.end(),?pObserver);

????
if?(m_ListObserver.end()?!=?iter)
????
{
????????m_ListObserver.erase(iter);
????}


????std::cout?
<<?"Detach?an?Observer\n";
}


void?Subject::Notify()
{
????std::cout?
<<?"Notify?Observers's?State\n";

????std::list
<Observer*>::iterator?iter1,?iter2;

????
for?(iter1?=?m_ListObserver.begin(),?iter2?=?m_ListObserver.end();
?????????iter1?
!=?iter2;
?????????
++iter1)
????
{
????????(
*iter1)->Update(this);
????}

}


void?Subject::SetState(STATE?nState)
{
????std::cout?
<<?"SetState?By?Subject\n";
????m_nSubjectState?
=?nState;
}


STATE?Subject::GetState()
{
????std::cout?
<<?"GetState?By?Subject\n";
????
return?m_nSubjectState;
}


Subject::
~Subject()
{
????std::list
<Observer*>::iterator?iter1,?iter2,?temp;

????
for?(iter1?=?m_ListObserver.begin(),?iter2?=?m_ListObserver.end();
????????iter1?
!=?iter2;
????????)
????
{
????????temp?
=?iter1;
????????
++iter1;
????????delete?(
*temp);
????}


????m_ListObserver.clear();
}


/*?--------------------------------------------------------------------
|????ConcreateSubject類成員函數(shù)的實現(xiàn)
|
----------------------------------------------------------------------
*/

void?ConcreateSubject::SetState(STATE?nState)
{
????std::cout?
<<?"SetState?By?ConcreateSubject\n";
????m_nSubjectState?
=?nState;
}


STATE?ConcreateSubject::GetState()
{
????std::cout?
<<?"GetState?By?ConcreateSubject\n";
????
return?m_nSubjectState;
}


/*?--------------------------------------------------------------------
|????ConcreateObserver類成員函數(shù)的實現(xiàn)
|
----------------------------------------------------------------------
*/

void?ConcreateObserver::Update(Subject*?pSubject)
{
????
if?(NULL?==?pSubject)
????????
return;

????m_nObserverState?
=?pSubject->GetState();

????std::cout?
<<?"The?ObeserverState?is?"?<<?m_nObserverState?<<?std::endl;
}


3)Main.cpp
/********************************************************************
????created:????2006/07/21
????filename:?????Main.cpp
????author:????????李創(chuàng)
????????????????
http://m.shnenglu.com/converse/

????purpose:????Observer模式的測試代碼
********************************************************************
*/


#include?
"Observer.h"
#include?
<iostream>

int?main()
{
????Observer?
*p1?=?new?ConcreateObserver;
????Observer?
*p2?=?new?ConcreateObserver;

????Subject
*?p?=?new?ConcreateSubject;
????p
->Attach(p1);
????p
->Attach(p2);
????p
->SetState(4);
????p
->Notify();

????p
->Detach(p1);
????p
->SetState(10);
????p
->Notify();

????delete?p;

????system(
"pause");

????
return?0;
}

posted on 2006-08-05 10:50 那誰 閱讀(3689) 評論(11)  編輯 收藏 引用 所屬分類: 設計模式

評論

# re: 常見設計模式的解析和實現(xiàn)(C++)之十五-Observer模式   回復  更多評論   

此設計有嚴重問題,可能導致系統(tǒng)崩潰。
看看這個函數(shù):
void Subject::Notify()
{
std::cout << "Notify Observers's State\n";

std::list<Observer*>::iterator iter1, iter2;

for (iter1 = m_ListObserver.begin(), iter2 = m_ListObserver.end();
iter1 != iter2;
++iter1)
{
(*iter1)->Update(this);
}
}
其中的Update()函數(shù)是讓用戶重載使用的。
如果用戶在這個函數(shù)里,調(diào)用了Attach或者Detach函數(shù),那會怎樣?這兩個函數(shù)會導致m_ListObserver內(nèi)容的變化,從而導致iter1失效。結(jié)果很可能就是系統(tǒng)崩潰。
2006-09-18 10:12 | skymountain

# re: 常見設計模式的解析和實現(xiàn)(C++)之十五-Observer模式   回復  更多評論   

不懂不要亂寫
2007-03-07 22:44 | ??

# re: 常見設計模式的解析和實現(xiàn)(C++)之十五-Observer模式   回復  更多評論   

確實存在1樓所述問題,有沒有什么好的辦法呢?
2008-10-23 15:35 | kevin

# re: 常見設計模式的解析和實現(xiàn)(C++)之十五-Observer模式   回復  更多評論   

將Attach 和Detach聲明成protected
2009-02-03 15:27 | 11

# re: 常見設計模式的解析和實現(xiàn)(C++)之十五-Observer模式 [未登錄]  回復  更多評論   

將Attach 和 Detach定義在Observer中,讓Observer主動attach 和Detach
2009-02-09 17:05 | peter

# re: 常見設計模式的解析和實現(xiàn)(C++)之十五-Observer模式   回復  更多評論   

for (iter1 = m_ListObserver.begin(), iter2 = m_ListObserver.end(); iter1 != iter2;)
{
temp = iter1;
++iter1;
delete (*temp);
}

此處應該用 iter1 = m_ListObserver.erase(iter1);而不能delete 觀察者對象,這樣的設計才比較真實。
2009-05-13 12:42 | 飄飄白云

# re: 常見設計模式的解析和實現(xiàn)(C++)之十五-Observer模式   回復  更多評論   

# re: 常見設計模式的解析和實現(xiàn)(C++)之十五-Observer模式 回復 更多評論
不懂不要亂寫
2007-03-07 22:44 | ??


你真垃圾
2009-10-16 17:37 | xxx

# re: 常見設計模式的解析和實現(xiàn)(C++)之十五-Observer模式 [未登錄]  回復  更多評論   

這個我覺得有很大的問題,observer設計模式應該是讓observer主動去注冊,你這個是用事件的發(fā)布者去將觀察者set進去的,只能說是使用了多態(tài),但不能說是observer設計。
2010-03-03 22:01 | Ken

# re: 常見設計模式的解析和實現(xiàn)(C++)之十五-Observer模式 [未登錄]  回復  更多評論   

連續(xù)存放的容器的迭代器才會在插入刪除時失效,List是不會的。。。
2010-07-11 11:36 | 123

# re: 常見設計模式的解析和實現(xiàn)(C++)之十五-Observer模式   回復  更多評論   

是不是可以通過加鎖保護的手段避免一樓所說的問題呢?
2012-06-18 11:26 | liang-li

# re: 常見設計模式的解析和實現(xiàn)(C++)之十五-Observer模式   回復  更多評論   

博主代碼實現(xiàn)上有瑕疵是不要緊的,我們要關(guān)注的主要是是博主實現(xiàn)Observer模式的思想才是。。。
2013-07-12 17:55 | hailongli
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美精品日韩www.p站| 噜噜噜久久亚洲精品国产品小说| 欧美激情久久久| 亚洲国产高清一区二区三区| 亚洲免费一在线| 99精品热6080yy久久| 亚洲高清二区| 亚洲电影观看| 亚洲日本无吗高清不卡| 亚洲国产欧美日韩另类综合| 亚洲大片免费看| 亚洲美洲欧洲综合国产一区| 99精品99| 亚洲午夜一区二区三区| 亚洲欧美日本国产专区一区| 亚洲欧美日韩专区| 欧美在线观看视频一区二区| 久久激五月天综合精品| 久久一区二区三区国产精品 | 欧美chengren| 久久免费国产| 久热精品视频在线观看一区| 麻豆精品国产91久久久久久| 久久亚洲精品网站| 欧美精品免费视频| 国产精品热久久久久夜色精品三区| 国产精品系列在线播放| 黑人中文字幕一区二区三区| 亚洲人成在线播放| 亚洲一区成人| 夜夜嗨av色一区二区不卡| 日韩视频免费看| 亚洲综合欧美日韩| 久久精品国产一区二区三区| 亚洲欧美大片| 久久av老司机精品网站导航| 美玉足脚交一区二区三区图片| 欧美成人精品在线播放| 亚洲日本乱码在线观看| 亚洲综合三区| 美女脱光内衣内裤视频久久影院| 欧美日韩不卡| 精品电影一区| 亚洲欧美第一页| 欧美成人小视频| 午夜精品福利一区二区三区av| 久久亚洲高清| 国产日本欧美一区二区| 91久久中文| 欧美国产精品劲爆| 亚洲欧美日韩第一区| 久久一区二区三区四区五区| 欧美乱妇高清无乱码| 国产精品综合久久久| 亚洲国产午夜| 久久精品国产亚洲a| 亚洲美女在线一区| 开心色5月久久精品| 国产精品欧美一区二区三区奶水| 亚洲高清一区二区三区| 久久精品系列| 亚洲主播在线| 国产精品美女久久久久av超清| 欧美日韩专区| 日韩视频专区| 蜜臀99久久精品久久久久久软件 | 欧美大片在线观看| 亚洲欧美在线观看| 欧美视频在线观看一区| 亚洲精品国精品久久99热一| 老鸭窝毛片一区二区三区| 亚洲综合色自拍一区| 欧美日韩亚洲一区二区三区在线| 亚洲第一毛片| 快she精品国产999| 小黄鸭视频精品导航| 国产精品午夜在线| 亚洲欧美日韩中文视频| 亚洲夜晚福利在线观看| 国产精品成人久久久久| 亚洲影院色在线观看免费| 亚洲精品视频一区| 欧美精品videossex性护士| 亚洲精品久久视频| 亚洲成色777777女色窝| 欧美电影在线观看完整版| 亚洲国产精品一区| 亚洲国产高清视频| 欧美激情第3页| 亚洲午夜免费视频| 中日韩在线视频| 国产精品网站在线观看| 久久久久国产精品一区三寸| 欧美在线免费视频| 亚洲成人在线观看视频| 亚洲国产精品一区二区三区| 欧美日韩精品久久久| 亚洲免费中文| 欧美中文字幕在线播放| 亚洲精品无人区| 在线亚洲免费视频| 国产亚洲人成a一在线v站 | 欧美va亚洲va日韩∨a综合色| 亚洲精品美女在线| 欧美激情第10页| 久久久久久婷| 欧美成人嫩草网站| 亚洲午夜黄色| 欧美一区二区三区视频在线观看 | 欧美精品电影| 亚洲一区中文| 欧美一区精品| 亚洲精品一区二区三区樱花| 久久人人精品| 久久精品一区二区三区四区| 国产一区二区三区久久久| 久久9热精品视频| 午夜精品久久久久久久男人的天堂| 怡红院精品视频| 宅男噜噜噜66一区二区| 亚洲第一黄网| 亚洲午夜精品17c| 91久久线看在观草草青青| 亚洲一区二区三区四区在线观看| 国产精品国产成人国产三级| 久久大香伊蕉在人线观看热2| 亚洲欧美另类中文字幕| 国产日本亚洲高清| 亚洲精品你懂的| 欧美大片免费久久精品三p| 欧美亚洲午夜视频在线观看| 欧美高清在线一区| 久久久噜噜噜| 国产精品国产三级国产专播品爱网| 午夜一区不卡| 久久先锋影音| 亚洲视频在线免费观看| 牛夜精品久久久久久久99黑人 | 亚洲欧美日韩精品久久亚洲区 | 亚洲国产一二三| 激情亚洲网站| 午夜免费日韩视频| 亚洲午夜电影| 欧美噜噜久久久xxx| 欧美激情1区| 在线色欧美三级视频| 午夜精品国产更新| 欧美一区二区三区精品| 国产精品人人做人人爽| 亚洲精品四区| 制服诱惑一区二区| 欧美好吊妞视频| 欧美激情视频一区二区三区不卡| 影音先锋欧美精品| 久久九九电影| 欧美18av| 亚洲欧洲精品成人久久奇米网 | 久久aⅴ国产欧美74aaa| 你懂的国产精品| 欧美日韩国产成人在线观看| 久久久久久久久综合| 欧美日韩午夜激情| 欧美成人久久| 极品裸体白嫩激情啪啪国产精品| 亚洲影院色在线观看免费| 日韩一区二区电影网| 久久国产视频网| 亚洲欧美日韩网| 欧美日韩视频专区在线播放| 欧美激情久久久| 在线观看91久久久久久| 亚洲自拍偷拍一区| 日韩亚洲欧美一区| 久久激情中文| 久久日韩精品| 国产综合亚洲精品一区二| 午夜精品久久久久久久男人的天堂 | 欧美电影免费| 玖玖玖国产精品| 国产精品人人爽人人做我的可爱| 亚洲激情国产精品| 亚洲精品久久久久| 欧美视频一区二区在线观看| 久久综合导航| 亚洲精品一区二区三区婷婷月| 欧美成人首页| 亚洲一区二区三区激情| 开心色5月久久精品| 日韩香蕉视频| 国产一区二区三区无遮挡| 开元免费观看欧美电视剧网站| 亚洲精品1区2区| 久久精品视频免费观看| 99视频在线观看一区三区| 国产欧美精品日韩| 欧美黑人在线播放| 99ri日韩精品视频| 一本色道久久综合亚洲精品小说 | 亚洲第一毛片| 欧美性色aⅴ视频一区日韩精品|