老鼠跑猫叫主人惊醒c++观察者模式实现
这个题目算是比较经典的观察者模式了,老鼠作为一个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++观察者模式实现的更多相关文章
- 以【猫叫、老鼠跑、主人醒】为例子,使用 javascript 来实现 观察者模式 (有在线演示)
“猫叫.老鼠跑.主人醒”是一个很古老的话题了,大家也都有各自的想法和解决方案.我也是看了很多,一开始的时候是相当的迷糊,这个怎么就是面试题了?考的是啥呀,和编程有关系吗?又是猫又是老鼠的,晕死了.后来 ...
- 程序设计: 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。(C#语言)
要求: 1.要有联动性,老鼠和主人的行为是被动的. 2.考虑可扩展性,猫的叫声可能引起其他联动效应. 我么能事件来一步一步来实现: 将要执行的老鼠逃跑,和主人惊醒的行为注册到事件中,猫叫之后引发事 ...
- 设计模式のObserver Pattern(观察者模式)----行为模式
一.问题产生背景 又被称为订阅发布模式. 最初流传最广的一个面试题:有一只猫咪,猫咪叫了一声,老鼠跑了,老人惊醒了,男主人骂,小偷吓得不敢动了....这就产生一个问题的模型,当对象间存在一对多关系时, ...
- C#设计模式 - 观察者模式(使用委托)
1.概念 观察者模式(有时又被称为发布-订阅Subscribe>模式.模型-视图View>模式.源-收听者Listener>模式或从属者模式)是软件设计模式的一种.在此种模式中,一个 ...
- 使用 javascript 来实现 观察者模式
以[猫叫.老鼠跑.主人醒]为例子,使用 javascript 来实现 观察者模式 (有在线演示) 2013-06-24 08:35 by 金色海洋(jyk)阳光男孩, 572 阅读, 4 评论, 收藏 ...
- (C#)算法题
1. Convert string from "AAABBCC" to "A3B2C2". 当面试者提出这个问题的时候,首先需要确认题意:譬如:字符串是不是顺序 ...
- 彻底搞清楚c#中的委托和事件
一.什么是委托呢? 听着名字挺抽象,确实不好理解.面试官最喜欢考察这个,而且更喜欢问:“委托和事件有何异同?”.如果对一些知识点没有想明白,那么很容易被绕进去.研究任何事物,我们不妨从它的定义开始,委 ...
- .NET面试题总结
1.c#垃圾回收机制 从以下方面入手展开: 1.压缩合并算法 2.代的机制 3.GC调用终结器 2.委托和事件 先说它的定义:委托的本质是类,类型安全的指针,然后从用途上考虑,事件是包装的委托 ...
- C# 常见面试问题汇总
1.c#垃圾回收机制 从以下方面入手展开: 1.压缩合并算法 2.代的机制 3.GC调用终结器 Garbage Collector . NET采用了和Java类似的方法由CLR(Common ...
随机推荐
- Dynamic CRM 2013学习笔记(二十九)报表设计:reporting service 报表开发常见问题
在报表开发过程中,经常会遇到各种各样的问题,比如The report cannot be displayed. (rsProcessingAborted),一点有意义的提示都没有:再就是分页问题,经常 ...
- EmberJs之使用Ember-Data
写在前面 最近比较忙,换了新工作还要学习很多全新的技术栈,并给自己找了很多借口来不去坚持写博客.常常具有讽刺意味的是,更多剩下的时间并没有利用而更多的是白白浪费,也许这就是青春吧,挥霍吧,这不是我想要 ...
- 跟我一起学WCF(8)——WCF中Session、实例管理详解
一.引言 由前面几篇博文我们知道,WCF是微软基于SOA建立的一套在分布式环境中各个相对独立的应用进行交流(Communication)的框架,它实现了最新的基于WS-*规范.按照SOA的原则,相对独 ...
- 选择哪种方式进行SharePoint的备份
关于SharePoint的备份还原功能,大家可能都有所了解.但是SharePoint一共有多少种备份方式呢,哪种备份方式是更适合你的呢,本文主要为大家梳理,并且深入的研究一下常见的几种备份方式,以便大 ...
- C#调用dll提示"试图加载格式不正确的程序"解决方法
程序在32位操作系统上运行正常,在64位操作系统上运行读卡功能提示”试图加载格式不正确“. ------------------------------------------------------ ...
- bigautocomplete实现联想输入,自动补全
bigautocomplete是一款Jquery插件.用它实现仿搜索引擎文本框自动补全插件功能很实用,使用也很简单,引入了插件之后写几行代码就可以实现,可以灵活设置. 先看效果图: 上图是通过ajax ...
- 【UML】如何看Android的UML图
UML图有很多类型,这里只讨论最重要也最常用的两种 - 类图和时序图. 1. 类图 通过类图,我们可以很容易的了解代码架构,理清模块之间的关系, 包括继承(Inheritance),实现(realiz ...
- Python错误、调试和测试
try: print('try...') r = 10 / int('a') print('result:', r) except ValueError as e: print('ValueError ...
- 结构体快排回顾(sort)
一般来说,我做竞赛的时候排序一般用快排 很快很方便 普通sort(从小到大) sort(a,a+n); 直接贴一段代码吧,包含了vector,sort,结构体等简单东西综合 #include < ...
- Win7下SQLite的简单使用
前言 SQLite 是一个软件库,实现了自给自足的.无服务器的.零配置的.事务性的 SQL 数据库引擎.SQLite 是在世界上最广泛部署的 SQL 数据库引擎.SQLite 源代码不受版权限制. 简 ...