有趣的小偷-主人-狗问题
前一段时间看到这个问题:小偷来了,狗汪汪的叫,主人起来了,小偷吓跑了!!
想了一下,其实这个问题是一个典型的观察着模式,今天有空,写了下代码,
和大家共享!!如果觉得有问题的话,可以一起讨论!!
#include<iostream>
#include<list>
#include<string>
using namespace std;
class CObserver
{
public:
CObserver(string strName="")
{
m_strName = strName;
}
virtual ~CObserver()
{}
virtual void Update()=0;
protected:
string m_strName;
};
class CNotifier
{
public:
CNotifier(string strName="")
{
m_strName = strName;
}
virtual ~CNotifier()
{}
virtual void Attach(CObserver *pObj)
{
m_listObserver.push_back(pObj);
}
virtual void Notify()
{
LISTITEM it = m_listObserver.begin();
for(;it != m_listObserver.end();it++)
{
(*it)->Update();
}
}
protected:
string m_strName;
list<CObserver*> m_listObserver;
typedef list<CObserver*>::iterator LISTITEM;
};
class CDog:public CObserver,public CNotifier
{
public:
CDog(string strName="")
{
CObserver::m_strName = strName;
CNotifier::m_strName = strName;
}
virtual ~CDog()
{}
virtual void Update()
{
cout<<CObserver::m_strName<<":汪汪汪......"<<endl;
Notify();
}
};
class CThief:public CObserver,public CNotifier
{
public:
CThief(string strName="")
{
CObserver::m_strName = strName;
CNotifier::m_strName = strName;
}
virtual ~CThief()
{}
virtual void Notify()
{
cout<<CNotifier::m_strName<<":这家有钱,翻墙过去看看,不好,有个大狗..."<<endl;
CNotifier::Notify();
}
virtual void Update()
{
cout<<CObserver::m_strName<<":有人起来了,快跑啊..."<<endl;
}
};
class CMaster:public CObserver,public CNotifier
{
public:
CMaster(string strName="")
{
CObserver::m_strName = strName;
CNotifier::m_strName = strName;
}
virtual ~CMaster()
{}
virtual void Update()
{
cout<<CObserver::m_strName<<":狗叫了,可能有小偷,起来看看..."<<endl;
Notify();
}
};
void main()
{
CDog dog("旺财");
CMaster master("唐伯虎");
CThief thief("宁王");
dog.Attach(&master);
master.Attach(&thief);
thief.Attach(&dog);
thief.Notify();
}