老鼠跑猫叫主人惊醒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 ...
随机推荐
- 分享一张SQLSERVER执行流程的图片
分享一张SQLSERVER执行流程的图片 有天论坛里有人问,一时间并发连接很多,是不是可以在SSMS里配置连接池 连接池是属于客户端的,配置只能在连接字符串里配置,修改你的连接字符串,SSMS没有一个 ...
- Zynga 开源其服务器性能监控分析工具 zPerfmon
流年不利的社交游戏服务商Zynga近日在官方博客宣布开源zPerfmon——该工具负责监控Zynga数以千计的社交游戏服务器.zPerfmon的源代码目前已经上传至Github. 包括Facebook ...
- 【原创】注册assembly 到GAC
http://msdn.microsoft.com/en-us/library/dkkx7f79.aspx http://stackoverflow.com/questions/2182316/how ...
- 从RTSP协议SDP数据中获得二进制的SPS、PPS
在RTSP协议的交互过程中,第二步客户端发送DESCRIBE请求之后,服务端会返回SDP内容,该SDP内容中有关于媒体和会话的描述,本篇文章主要给出如何从SDP字符串中得到H264视频信息中的sps. ...
- Html5 学习系列(六)Html5本地存储和本地数据库
一个网站如何能在客户的浏览器存储更多的数据呢? 在Html4的时代在浏览器端存储点网站个性化的数据,尤其是用户浏览器的痕迹,用户的相关数据等一般只能存储在Cookie中,但是大多是浏览器对于Cooki ...
- [外挂1] MFC 鼠标位置设置
a.取得窗口相对坐标 b.读出游戏窗口信息GetWindowRect c.移动鼠标指针SetCursorPos HWND gameh;//游戏窗口句柄 RECT r1;//RECT结构表示一个矩 ...
- 修复SharePoint 2013 Search 拓扑错误
Problem 当创建和配置SharePoint 2013 Search Service Application成功之后,进入详细配置页后,在Search Application Topology节点 ...
- spring mvc ajax返回值乱码
加入如下配置: <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHan ...
- 连接oracle jdbc
我使用的是精简版的oracle. 1 导入oracle驱动包 oracle下路径 D:\oracle\app\oracle\product\11.2.0\server\jdbc\lib\ojdbc6 ...
- maven nexus 3 third party 构件上传
mvn -e deploy:deploy-file -DgroupId=com.oracle -DartifactId=JDBCDriver -Dversion=12.0.1 -Dpackaging= ...