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

那誰的技術博客

感興趣領域:高性能服務器編程,存儲,算法,Linux內核
隨筆 - 210, 文章 - 0, 評論 - 1183, 引用 - 0
數據加載中……

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

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

UML結構圖:



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

實現:
1)Observer.h
/********************************************************************
????created:????2006/07/20
????filename:?????Observer.h
????author:????????李創
????????????????
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();????????????????????????????//?通知對象改變狀態
????void?Attach(Observer?*pObserver);????????//?新增對象
????void?Detach(Observer?*pObserver);????????//?刪除對象

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

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

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

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

protected:
????STATE?m_nObserverState;????????????????????
//?模擬保存Observer狀態的變量
}
;

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

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

}
;

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

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

#endif

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

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


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

/*?--------------------------------------------------------------------
|????Subject類成員函數的實現
|
?----------------------------------------------------------------------
*/


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類成員函數的實現
|
----------------------------------------------------------------------
*/

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類成員函數的實現
|
----------------------------------------------------------------------
*/

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:????????李創
????????????????
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 那誰 閱讀(3693) 評論(11)  編輯 收藏 引用 所屬分類: 設計模式

評論

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

此設計有嚴重問題,可能導致系統崩潰。
看看這個函數:
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()函數是讓用戶重載使用的。
如果用戶在這個函數里,調用了Attach或者Detach函數,那會怎樣?這兩個函數會導致m_ListObserver內容的變化,從而導致iter1失效。結果很可能就是系統崩潰。
2006-09-18 10:12 | skymountain

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

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

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

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

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

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

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

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

# re: 常見設計模式的解析和實現(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: 常見設計模式的解析和實現(C++)之十五-Observer模式   回復  更多評論   

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


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

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

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

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

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

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

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

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

博主代碼實現上有瑕疵是不要緊的,我們要關注的主要是是博主實現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久久精品网| 毛片一区二区| 国产欧美日韩精品a在线观看| 欧美色中文字幕| 国产精品福利片| 国产精品一区免费在线观看| 激情综合网址| 亚洲精品免费在线| 亚洲一区二区三区777| 性欧美1819性猛交| 久久先锋影音| 亚洲第一视频| 亚洲精品综合在线| 欧美亚洲免费在线| 欧美好吊妞视频| 国产精品影音先锋| 亚洲成人中文| 亚洲伦理中文字幕| 国产精品草莓在线免费观看| 欧美色播在线播放| 国产综合久久久久久鬼色| 最新国产拍偷乱拍精品| 亚洲伊人观看| 久久视频国产精品免费视频在线| 欧美成年人网站| 亚洲一区二区三区精品在线| 欧美国产精品人人做人人爱| 中国成人在线视频| 奶水喷射视频一区| 国产精品久久久久毛片大屁完整版 | 欧美日韩精品一二三区| 国产精品一级二级三级| 午夜视频一区在线观看| 亚洲日韩中文字幕在线播放| 亚洲欧美日韩在线高清直播| 欧美成人r级一区二区三区| 国产精品99久久久久久www| 久热国产精品视频| 国产一区二区三区精品欧美日韩一区二区三区 | 国产精品天美传媒入口| 欧美风情在线| 欧美一级淫片播放口| 欧美激情91| 国产综合精品| 欧美一区二区在线视频| 亚洲精品视频在线看| 久久视频在线看| 国产欧美一区二区色老头 | 美女国产一区| 亚洲欧美在线另类| 国产精品国产a级| 一区二区三区高清不卡| 欧美激情视频一区二区三区在线播放 | 免费成人高清| 一区在线视频| 久色婷婷小香蕉久久| 欧美一区二区在线播放| 国产精品欧美激情| 亚洲一区日韩| 亚洲精品少妇30p| 欧美国产免费| 99re热这里只有精品视频| 欧美高清一区| 欧美电影在线观看完整版| 亚洲黄色在线| 亚洲激情亚洲| 欧美日韩一区高清| 亚洲欧美乱综合| 亚洲午夜精品久久| 国产欧美日韩专区发布| 久久精品一区二区| 久久人体大胆视频| 亚洲乱亚洲高清| 亚洲美女在线一区| 国产精品一区二区你懂得| 久久国产高清| 老**午夜毛片一区二区三区| 亚洲精选一区| 91久久综合| 一区二区三区国产| 国产欧美一区二区白浆黑人| 久久久久中文| 免费观看成人鲁鲁鲁鲁鲁视频| 亚洲人在线视频| 亚洲视频欧美视频| 韩国v欧美v日本v亚洲v| 亚洲国产精品999| 欧美视频一区二| 久久综合一区| 欧美香蕉大胸在线视频观看| 久久国产欧美| 欧美国产第一页| 欧美亚洲视频| 美女视频网站黄色亚洲| 亚洲欧美日本日韩| 噜噜噜噜噜久久久久久91| 亚洲天堂第二页| 久久久久国产精品午夜一区| 9久re热视频在线精品| 亚洲欧美日韩国产中文| 日韩午夜在线视频| 久久爱另类一区二区小说| 99视频在线精品国自产拍免费观看| 亚洲香蕉视频| av成人激情| 久久久99免费视频| 亚洲永久免费视频| 媚黑女一区二区| 欧美专区日韩专区| 欧美日韩国产限制| 欧美激情亚洲激情| 一区二区在线观看视频| 亚洲一区二区动漫| 一区二区三区产品免费精品久久75 | 亚洲特级毛片| 欧美电影在线免费观看网站| 久久欧美肥婆一二区| 欧美视频成人| 亚洲国产mv| 在线视频国产日韩| 久久er99精品| 欧美一区二区在线免费观看 | 欧美freesex8一10精品| 久久午夜影视| 国自产拍偷拍福利精品免费一| 亚洲视频日本| 亚洲一区二区三区四区五区午夜| 免费久久精品视频| 欧美第一黄色网| 国语自产精品视频在线看| 亚洲一区二区三区四区五区午夜| 日韩亚洲视频| 欧美国产高潮xxxx1819| 欧美国产第一页| 亚洲国产精品精华液2区45| 久久久久国产精品午夜一区| 久久午夜精品| 亚洲国产精品va在线观看黑人| 欧美在线视频免费观看| 久久精品国产第一区二区三区最新章节| 国产九色精品成人porny| 亚洲精品视频二区| 女同一区二区| 亚洲国产成人porn| 亚洲精品一区二区三区蜜桃久| 麻豆精品在线视频| 亚洲高清视频一区| 99在线精品观看| 欧美日韩精品二区| 久久精品免费看| 影音先锋欧美精品| 欧美成人精品在线播放| 亚洲激情成人在线| 国产精品99久久久久久有的能看| 欧美性一区二区| 香蕉久久夜色精品国产| 免费在线观看日韩欧美| 亚洲国产三级| 欧美日韩在线观看一区二区| 亚洲视频在线一区观看| 久久大综合网| 亚洲激情在线播放| 欧美日韩精品久久| 欧美亚洲午夜视频在线观看| 久久夜色撩人精品| 亚洲午夜电影在线观看| 合欧美一区二区三区| 欧美日韩国产电影| 欧美一二三视频| 亚洲精品在线免费观看视频| 久久精品一区二区国产| 99视频一区| 国产亚洲欧美一区二区三区| 美日韩精品视频免费看| 午夜激情一区| 亚洲美女在线观看| 久久只精品国产| 亚洲尤物影院| 99国产精品久久久| 亚洲二区视频在线| 国产日本欧美一区二区| 欧美人妖在线观看| 玖玖国产精品视频| 久久国产精品一区二区三区| 中日韩高清电影网| 亚洲国产精品传媒在线观看| 久久久亚洲成人| 小黄鸭精品aⅴ导航网站入口| 亚洲精品一区二| 亚洲国产成人午夜在线一区| 国产一区二区三区精品欧美日韩一区二区三区 | 久久久噜噜噜|