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

那誰的技術(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://www.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://www.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://www.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>
            国产精品中文在线| 欧美中文字幕在线视频| 欧美国产日本在线| 91久久精品国产91性色| 亚洲第一中文字幕在线观看| 亚洲欧美日韩久久精品| 先锋影音久久久| 欧美一区二区在线看| 国产一区在线看| 欧美高清视频在线播放| 免费亚洲一区二区| 亚洲美女毛片| 亚洲欧美视频在线| 伊人久久大香线蕉综合热线| 欧美激情亚洲国产| 欧美日韩伊人| 久久久精品一区| 牛牛影视久久网| 亚洲一区二区动漫| 香港成人在线视频| 亚洲黄色免费| 亚洲主播在线| 亚洲国产欧美久久| 亚洲一区二区黄| 亚洲黄色片网站| 亚洲综合国产| 亚洲人精品午夜| 午夜视频在线观看一区二区| 91久久国产综合久久蜜月精品 | 午夜日韩在线| 久久精品噜噜噜成人av农村| 日韩一区二区精品视频| 亚洲欧美大片| 日韩亚洲视频在线| 久久久av毛片精品| 亚洲欧美国产高清va在线播| 噜噜噜在线观看免费视频日韩 | 伊人婷婷欧美激情| 在线亚洲电影| 亚洲精品视频一区| 欧美一区二区视频在线观看2020 | 日韩午夜免费| 久久精品视频导航| 新片速递亚洲合集欧美合集| 久久综合九色99| 久久九九精品| 国产精品嫩草久久久久| 亚洲精品视频一区| 亚洲第一毛片| 午夜综合激情| 午夜精品久久久久久久久久久久久 | 亚洲国产日韩欧美一区二区三区| 国产精品久久久久久妇女6080| 免费观看成人| 国产一在线精品一区在线观看| 一区二区三区波多野结衣在线观看| 在线国产精品一区| 久久精品91久久久久久再现| 国产精品久久久久久久久久免费| 亚洲人久久久| 久久先锋影音av| 久久av一区二区| 国产精品一区免费视频| 一本高清dvd不卡在线观看| 99re热这里只有精品视频| 牛牛影视久久网| 亚洲国产电影| 亚洲精品视频中文字幕| 欧美xxx成人| 欧美电影在线播放| 亚洲三级观看| 欧美日韩国产专区| 一本色道久久综合亚洲二区三区| 亚洲午夜久久久久久尤物| 欧美区在线观看| 一区二区精品在线| 亚洲欧美日韩一区二区| 亚洲欧美精品伊人久久| 欧美制服第一页| 红桃视频亚洲| 欧美91福利在线观看| 亚洲欧洲一区| 亚洲在线免费视频| 国产日韩欧美a| 久久婷婷av| 亚洲久久视频| 欧美在线视频免费| 亚洲观看高清完整版在线观看| 免费成人小视频| 一本色道久久加勒比88综合| 欧美在线观看视频一区二区三区| 一区在线观看| 欧美视频在线观看| 欧美在线视频免费观看| 欧美国产一区二区在线观看| 亚洲视频在线二区| 亚洲一区尤物| 极品尤物一区二区三区| 欧美成人午夜免费视在线看片 | 久久米奇亚洲| 久久综合久久综合这里只有精品| 欧美在线看片| 亚洲精品日韩一| 国产精品一二三视频| 久久精品中文| 一区二区三区国产在线观看| 久久久人人人| 亚洲一区在线播放| 亚洲国产欧美精品| 国产伦精品一区| 欧美成人一区二区| 欧美在线欧美在线| 在线一区观看| 亚洲成色777777女色窝| 性欧美1819sex性高清| 亚洲精品在线视频| 国产自产v一区二区三区c| 欧美日韩亚洲一区二区三区四区| 欧美一区二区私人影院日本| 日韩午夜在线视频| 欧美成人69av| 久久蜜臀精品av| 欧美一区二区高清在线观看| 一本久久知道综合久久| 1769国内精品视频在线播放| 国产日产精品一区二区三区四区的观看方式 | 久久天天躁夜夜躁狠狠躁2022| 亚洲最新合集| 亚洲国产精品美女| 国产婷婷色一区二区三区| 欧美午夜精品久久久久久久| 欧美成人中文字幕| 蜜桃伊人久久| 久久免费视频网站| 久久精品国产在热久久| 午夜精品久久久久久久99水蜜桃 | 久久久www免费人成黑人精品| 亚洲日本免费| 日韩视频一区二区| 91久久久国产精品| 亚洲第一精品在线| 亚洲国产日韩精品| 亚洲国产精品一区二区尤物区 | 欧美另类videos死尸| 欧美 日韩 国产在线| 久久在线免费观看| 久久综合中文色婷婷| 美日韩丰满少妇在线观看| 老司机凹凸av亚洲导航| 美女啪啪无遮挡免费久久网站| 久久三级视频| 欧美成ee人免费视频| 欧美精品一区二区蜜臀亚洲| 欧美精品一区在线发布| 欧美日韩不卡合集视频| 国产精品video| 国产精品视频在线观看| 国产一区二区三区四区在线观看| 国产亚洲精品v| 在线日韩av片| 999在线观看精品免费不卡网站| 一区二区冒白浆视频| 亚洲淫片在线视频| 久久久久久久久伊人| 久久综合色88| 91久久中文| 亚洲一区日韩在线| 久久久人人人| 欧美日本免费一区二区三区| 国产精品色午夜在线观看| 国产日本欧美一区二区三区在线| 一区精品在线播放| 99精品视频免费在线观看| 欧美一级视频精品观看| 免费黄网站欧美| 一二三区精品| 久久激情综合| 欧美日韩在线播放| 黄色成人小视频| 亚洲图片欧洲图片av| 久久久久五月天| 亚洲狼人精品一区二区三区| 午夜亚洲性色福利视频| 欧美极品在线播放| 国产一区二区在线免费观看| 日韩一级黄色大片| 久久久久久夜精品精品免费| 亚洲精品免费在线| 久久精品亚洲一区| 国产精品入口日韩视频大尺度| 伊人成人在线视频| 香蕉亚洲视频| 亚洲精品美女在线观看播放| 久久成人精品无人区| 欧美四级剧情无删版影片| 亚洲成人在线| 久久精品国产成人| 在线亚洲国产精品网站| 欧美激情中文字幕一区二区| 黄色成人小视频|