设计模式之观察者模式 及 c++ 实现

     观察者模式是最常用的设计模式之一,在此模式中,一个目标对象管理依赖它的观察对象,并在自身状态发生改变的时候主动通知所有注册的观察者对象。观察者模式常被用作设计事件处理系统。
     例如下面的示例代码是常见的观察者模式的示例,在此用c++进行实现。猫作为目标物件 管理两个观察者,一个是主人,一个是老鼠。当猫叫这个事件发生时能够调用观察者相应的响应函数,从而做出相应的反应。
    通过观察者模式可以优化程序的业务逻辑,实现松耦合、易维护。

下载示例代码(VC6下编译通过):  ObserverSample.rar
//-------------代码示例-------------

#include <list>
#include <iostream>
using namespace std;

class CObserver;
class CSubject
{
protected:
 CSubject(){m_obsList=new list<CObserver*>;};
private:
 list<CObserver*>* m_obsList;
public:
 virtual attach(CObserver* pObs);
 virtual detach(CObserver* pObs);
 virtual notify();
 virtual action()=0;
};
class CCat:public CSubject
{
public:
 void Cry();
 virtual action(){Cry();};
};

class CObserver  
{
protected:
 CObserver();
 virtual ~CObserver();
public:
 virtual void Response()=0;
};
class CMaster:public CObserver
{
public:
 CMaster(CSubject* pSubject);
 virtual void Response();
protected:
 CSubject* m_pSubject;
};
class CMouse:public CObserver
{
public:
 CMouse(CSubject* pSubject);
 virtual void Response();
protected:
 CSubject* m_pSubject;
};

//  实现

CObserver::CObserver()
{

}

CObserver::~CObserver()
{

}

void CMaster::Response()
{
 cout<<"the master wakeup"<<endl;
}

CMaster::CMaster( CSubject* pSubject )
{
 cout<<"master is created..."<<endl;
 m_pSubject=pSubject;
 pSubject->attach(this);
}
void CMouse::Response()
{
 cout<<"the mouse run away..."<<endl;
}

CMouse::CMouse( CSubject* pSubject )
{
 cout<<"master is created..."<<endl;
 m_pSubject=pSubject;
 pSubject->attach(this);
}
CSubject::attach( CObserver* pObs )
{
 m_obsList->push_front(pObs);
}

CSubject::detach( CObserver* pObs )
{
 if (pObs)
 {
  m_obsList->remove(pObs);
 }
}

CSubject::notify()
{
 list<CObserver*>::iterator it;
 it=m_obsList->begin();
 for (;it!=m_obsList->end();it++)
 {
  (*it)->Response();
 }
}

void CCat::Cry()
{
 cout<<"the cat cry..."<<endl;
 this->notify();
}


原文地址: http://www.gddhx.com/post/8.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值