这个题目算是比较经典的观察者模式了,老鼠作为一个Subject,主动发出跑的动作,紧跟着猫由于老鼠的跑而发出叫声,主人也被惊醒,在这里猫跟主人都是被动的,是观察者角色,代码实现如下:

 class CSubject;
//观察者
class CObserver
{
public:
CObserver(){}
virtual ~CObserver(){}
virtual void Update(CSubject* pSubject) = ;
}; //目标即主题,可理解为由于本对象变化导致其他对象跟随变化
class CSubject
{
public:
void Attach(CObserver* pO)
{
_ls.push_back(pO);
}
void Detach(CObserver* pO)
{
_ls.remove(pO);
}
void Notify()
{
for (list<CObserver*>::iterator it=_ls.begin();it!=_ls.end();it++)
{
(*it)->Update(this);
}
}
private:
list<CObserver*> _ls;
}; //猫为观察者
class CCat:public CObserver
{
public:
CCat(){}
virtual ~CCat(){}
virtual void Update(CSubject* pSubject){
Say();
}
void Say()
{
printf("猫叫了\r\n");
}
}; //人为观察者
class CPerson:public CObserver
{
public:
CPerson(){}
virtual ~CPerson(){} virtual void Update(CSubject* pSubject){
Say();
}
void Say()
{
printf("人醒了\r\n");
}
}; //老鼠为主题
class CMouse:public CSubject
{
public: void Say()
{
printf("老鼠叫了\r\n");
Notify();
}
};
 int _tmain(int argc, _TCHAR* argv[])
{ //老鼠跑猫叫主人醒
CMouse* pMouse = new CMouse();
CCat* pCat = new CCat();
CPerson* pPerson = new CPerson(); pMouse->Attach(pCat);
pMouse->Attach(pPerson);
pMouse->Say();
  
return ;
}

main里指针没做释放,如何优雅的释放呢,还在考虑中,如果讲究对称美,那就是

 int _tmain(int argc, _TCHAR* argv[])
{ //老鼠跑猫叫主人醒
CMouse* pMouse = new CMouse();
CCat* pCat = new CCat();
CPerson* pPerson = new CPerson(); pMouse->Attach(pCat);
pMouse->Attach(pPerson);
pMouse->Say(); //对称美,但是如此麻烦,还有其他解决方法吗
pMouse->Detach(pCat);
pMouse->Detach(pPerson);
delete pPerson;
delete pCat;
delete pMouse; return ;
}

欢迎各位发表观点

老鼠跑猫叫主人惊醒c++观察者模式实现的更多相关文章

  1. 以【猫叫、老鼠跑、主人醒】为例子,使用 javascript 来实现 观察者模式 (有在线演示)

    “猫叫.老鼠跑.主人醒”是一个很古老的话题了,大家也都有各自的想法和解决方案.我也是看了很多,一开始的时候是相当的迷糊,这个怎么就是面试题了?考的是啥呀,和编程有关系吗?又是猫又是老鼠的,晕死了.后来 ...

  2. 程序设计: 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。(C#语言)

    要求:  1.要有联动性,老鼠和主人的行为是被动的.  2.考虑可扩展性,猫的叫声可能引起其他联动效应. 我么能事件来一步一步来实现: 将要执行的老鼠逃跑,和主人惊醒的行为注册到事件中,猫叫之后引发事 ...

  3. 设计模式のObserver Pattern(观察者模式)----行为模式

    一.问题产生背景 又被称为订阅发布模式. 最初流传最广的一个面试题:有一只猫咪,猫咪叫了一声,老鼠跑了,老人惊醒了,男主人骂,小偷吓得不敢动了....这就产生一个问题的模型,当对象间存在一对多关系时, ...

  4. C#设计模式 - 观察者模式(使用委托)

    1.概念 观察者模式(有时又被称为发布-订阅Subscribe>模式.模型-视图View>模式.源-收听者Listener>模式或从属者模式)是软件设计模式的一种.在此种模式中,一个 ...

  5. 使用 javascript 来实现 观察者模式

    以[猫叫.老鼠跑.主人醒]为例子,使用 javascript 来实现 观察者模式 (有在线演示) 2013-06-24 08:35 by 金色海洋(jyk)阳光男孩, 572 阅读, 4 评论, 收藏 ...

  6. (C#)算法题

    1. Convert string from "AAABBCC" to "A3B2C2". 当面试者提出这个问题的时候,首先需要确认题意:譬如:字符串是不是顺序 ...

  7. 彻底搞清楚c#中的委托和事件

    一.什么是委托呢? 听着名字挺抽象,确实不好理解.面试官最喜欢考察这个,而且更喜欢问:“委托和事件有何异同?”.如果对一些知识点没有想明白,那么很容易被绕进去.研究任何事物,我们不妨从它的定义开始,委 ...

  8. .NET面试题总结

    1.c#垃圾回收机制 从以下方面入手展开:  1.压缩合并算法   2.代的机制  3.GC调用终结器 2.委托和事件 先说它的定义:委托的本质是类,类型安全的指针,然后从用途上考虑,事件是包装的委托 ...

  9. C# 常见面试问题汇总

    1.c#垃圾回收机制 从以下方面入手展开:  1.压缩合并算法   2.代的机制  3.GC调用终结器 Garbage Collector . NET采用了和Java类似的方法由CLR(Common ...

随机推荐

  1. struts 标签<s:ierator>的简单使用说明

    struts 标签<s:ierator>的简单使用说明,只显示<s:ierator> 的前6条数据 <s:iterator value="lstVisitor& ...

  2. Razor视图引擎输出没有编码的 Html 字符串

    优先选择: @Html.Raw(mystring) 在MVC 3中,你可以这样: ViewBag.Stuff = "<li>Menu</li>" 在视图中也 ...

  3. SymmetricDS 3.5.0 发布,数据同步和复制

    SymmetricDS 3.5.0 关闭 53 个问题,新增对 SQLite on Android.Sybase ASE 和 Sybase ASA 的支持:增加了文件同步功能,可同步目录.文件过滤和脚 ...

  4. Dynamic CRM 2013学习笔记(十七)JS读写各种类型字段方法及技巧

    我们经常要对表单里各种类型的字段进行读取或赋值,下面列出各种类型的读写方法及注意事项: 1. lookup 类型 清空值 var state = Xrm.Page.getAttribute(" ...

  5. AngularJS实战项目(Ⅰ)--含源码

    前言 钻研ABP框架的日子,遇到了很多新的知识,因为对自己而言是新知识,所以经常卡在很多地方,迟迟不能有所突破,作为一个稍有上进心的程序员,内心绝对是不服输的,也绝对是不畏困难的,心底必然有这样一股力 ...

  6. DFD数据流程图

    顶层图DFD 0层图 1层图

  7. RabbitMQ(三) -- Publish/Subscribe

    RabbitMQ(三) -- Publish/Subscribe `rabbitmq`支持一对多的模式,一般称为发布/订阅.也就是说,生产者产生一条消息后,`rabbitmq`会把该消息分发给所有的消 ...

  8. [BTS] Error Can't update assemblies.

    Removal of the assembly failed. Make sure that all items in the assembly you are trying to remove fu ...

  9. paip.提升性能----jvm参数调整.txt

    paip.提升性能----jvm参数调整.txt 作者Attilax  艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn.n ...

  10. paip.消除 Java 的冗长try/catch/finally

    paip.消除 Java 的冗长try/catch/finally 作者Attilax 艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blo ...