您的位置:首页 > 职场人生

P240 程序设计: 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。(VC版)

2011-03-01 11:26 489 查看
这是一道经典的面试题!但网上流传的都是C#版。心血来潮,东拼西凑终于整出个C++版。
用的是设计模式中的观察者模式!那么谁是观察者(observer),谁又是被观察者呢?当然了,我认为老鼠和主人都是观察者,而我们
可爱的猫咪就是被观察者喽!程序的核心是:被观察者(subject,在这里被猫继承)应该拥有一个观察者的集合作为自己的成员函数。
当猫大叫时,就遍历这个集合,所有的观察者要作出不同反应。

// Subject.h:
#if !defined AFX_SUBJECT_H__
#define AFX_SUBJECT_H__
#include <list>
#include <string>
using namespace std;
class Observer;
class Subject
{
public:
virtual ~Subject();
virtual void Attach(Observer* obv)=0;
virtual void Detach(Observer* obv)=0;
protected:
Subject();
};

class Cat:public Subject
{
public:
Cat();
~Cat();
virtual void Attach(Observer* obv);
virtual void Detach(Observer* obv);
void Cry();
protected:
private:
list<Observer*>* _obvs;
};
#endif

#if !defined AFX_OBSERVER_H__
#define AFX_OBSERVER_H__
#include "Subject.h"
#include <string>
using namespace std;
class Observer
{
public:
virtual ~Observer();
virtual void Response(Subject* sub)=0;
protected:
Observer();
private:
};

class Mouse:public Observer
{
public:
Mouse(Subject* sub,string sName);
virtual ~Mouse();
//传入Subject作为参数,这样可以让一个View属于多个Subject。
void Response(Subject* sub);
protected:
private:
Subject* _sub;
string m_sName;
};
class Master:public Observer
{
public:
Master(Subject* sub);
virtual ~Master();

//传入Subject作为参数,这样可以让一个View属于多个Subject。
void Response(Subject* sub);
protected:
private:
Subject* _sub;
};
#endif

#include "Subject.h"
#include "Observer.h"
#include <iostream>
#include <list>
using namespace std;
Subject::Subject()
{

}
Subject::~Subject()
{

}
Cat::Cat()
{
_obvs = new list<Observer*>;
}
Cat::~Cat()
{

}
void Cat::Attach(Observer* obv)
{
_obvs->push_back(obv);
}
void Cat::Detach(Observer* obv)
{
if (obv!=NULL)
{
_obvs->remove(obv);
}
}
void Cat::Cry()
{
cout<<"Cat cryed!"<<endl;
list<Observer*>::iterator it;
it = _obvs->begin();
for (;it != _obvs->end();it++)
{
//关于模版和iterator的用法
(*it)->Response(this);
}
}

#include "Observer.h"
#include "Subject.h"
#include <iostream>
#include <string>
using namespace std;
Observer::Observer()
{
}
Observer::~Observer()
{

}
Mouse::Mouse(Subject* sub,string sName)
{
m_sName=sName;
_sub=sub;
_sub->Attach(this);
}
Mouse::~Mouse()
{
_sub->Detach(this);
if (_sub!=0)
{
delete _sub;
}
}
void Mouse::Response(Subject* sub)
{
cout<<m_sName<<" attempt to escape!"<<endl;
}
Master::Master(Subject* sub)
{
_sub=sub;
_sub->Attach(this);
}
Master::~Master()
{
_sub->Detach(this);
if (_sub!=0)
{
delete _sub;
}
}
void Master::Response(Subject* sub)
{
cout<<"host waken!"<<endl;
}

// Main.cpp
#include "Subject.h"
#include "Observer.h"
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
Cat* cat = new Cat();
Mouse* mouse1 = new Mouse(cat,"mouse1");
Mouse* mouse2 = new Mouse(cat,"mouse2");
Master* master = new Master(cat);
cat->Cry();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐