有趣的小偷-主人-狗问题

bitxinhai 2009-11-08 11:17:14
前一段时间看到这个问题:小偷来了,狗汪汪的叫,主人起来了,小偷吓跑了!!
想了一下,其实这个问题是一个典型的观察着模式,今天有空,写了下代码,
和大家共享!!如果觉得有问题的话,可以一起讨论!!

#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();
}
...全文
349 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
genlic 2009-11-21
  • 打赏
  • 举报
回复
顶~~
接分来了~~
xcl122687969 2009-11-20
  • 打赏
  • 举报
回复
UP
o老猫钓鱼o 2009-11-20
  • 打赏
  • 举报
回复
设计模式是个好东西,我也在学
aizibion 2009-11-20
  • 打赏
  • 举报
回复
下午公司才考了设计模式,貌似不能及格=。=
caicai999 2009-11-20
  • 打赏
  • 举报
回复
设计模式?完全没有接触过哦
wwwzyb2002 2009-11-20
  • 打赏
  • 举报
回复
好东西,代码收藏了!
cphj 2009-11-09
  • 打赏
  • 举报
回复
有趣
bitxinhai 2009-11-09
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 cattycat 的回复:]
题目很有意思,进来看原来是Observer模式的。
但dog,thief和master都同时继承Observer和Notifier不太好吧。
[/Quote]

这个问题里面,根据dog,thief和master的行为可以分析出来
他们三个同时为观察者和通知者,当然同时继承Observer和Notifier了
komfanter 2009-11-08
  • 打赏
  • 举报
回复
不知到结贴了还能否接分
bitxinhai 2009-11-08
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 fblgzdq 的回复:]
请问搂住到底要表达什么意思呢?
这段代码实现了什么功能呢?

可否解释一下
[/Quote]

就是为了解决这个问题:小偷来了,狗汪汪的叫,主人起来了,小偷吓跑了!! 看起来问题很是模糊吧。。。
fblgzdq 2009-11-08
  • 打赏
  • 举报
回复
请问搂住到底要表达什么意思呢?
这段代码实现了什么功能呢?

可否解释一下
fblgzdq 2009-11-08
  • 打赏
  • 举报
回复
接分讨论
beyond071 2009-11-08
  • 打赏
  • 举报
回复
观摩一下^_^
bitxinhai 2009-11-08
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 leisurelybean 的回复:]
这代码看的我头晕……
[/Quote]

设计模式这东西,学起来确实不容易,我一开始学的时候也很头晕啊,
学明白了,才体会到它的强大之处!!!
LeisurelyBean 2009-11-08
  • 打赏
  • 举报
回复
这代码看的我头晕……
bitxinhai 2009-11-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 shuilongyin_00 的回复:]
C/C++ code
……


怎么没按照想响的发呢!再来过……
[/Quote]

哈哈,不好意思,好久没有发代码了,忘了!!
shuilongyin_00 2009-11-08
  • 打赏
  • 举报
回复

55555555555555
shuilongyin_00 2009-11-08
  • 打赏
  • 举报
回复

……


怎么没按照想响的发呢!再来过……
shuilongyin_00 2009-11-08
  • 打赏
  • 举报
回复
请使用

#include
……

发布代码!

呵呵!

劫分!……
加载更多回复(18)

64,685

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧