观察者(Observer)模式又名发布-订阅(Publish/Subscribe)模式。GOF 给观察者模

式如下定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依

赖于它的对象都得到通知并被自动更新

1) 抽象目标角色(Subject):目标角色知道它的观察者,可以有任意多个观察者观察同一

个目标。并且提供注册和删除观察者对象的接口。目标角色往往由抽象类或者接口来实

现。

2) 抽象观察者角色(Observer):为那些在目标发生改变时需要获得通知的对象定义一个

更新接口。抽象观察者角色主要由抽象类或者接口来实现。

3) 具体目标角色(Concrete Subject):将有关状态存入各个Concrete Observer 对象。当

它的状态发生改变时, 向它的各个观察者发出通知。

4) 具体观察者角色(Concrete Observer):存储有关状态,这些状态应与目标的状态保持

一致。实现Observer 的更新接口以使自身状态与目标的状态保持一致。在本角色内也

可以维护一个指向Concrete Subject 对象的引用。

 

#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);

};

/* --------------------------------------------------------------------

|    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;

}

 

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 2012-01-11 19:53 柳清风 阅读(168) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


统计