作用:
定義對象間的一種一對多的依賴關系,當一個對象的狀態發生改變時,所有依賴于它的對象都得到通知并被自動更新.
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://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();????????????????????????????//?通知對象改變狀態
????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://www.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://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;
}
