P240 程序设计: 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。(VC版)
2011-03-01 11:26
489 查看
这是一道经典的面试题!但网上流传的都是C#版。心血来潮,东拼西凑终于整出个C++版。
用的是设计模式中的观察者模式!那么谁是观察者(observer),谁又是被观察者呢?当然了,我认为老鼠和主人都是观察者,而我们
可爱的猫咪就是被观察者喽!程序的核心是:被观察者(subject,在这里被猫继承)应该拥有一个观察者的集合作为自己的成员函数。
当猫大叫时,就遍历这个集合,所有的观察者要作出不同反应。
用的是设计模式中的观察者模式!那么谁是观察者(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; }
相关文章推荐
- 程序设计: 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。(C#语言)
- 程序设计: 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。(C#语言)
- 程序设计: 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。
- 程序设计: 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒
- 程序设计: 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。(C#语言)
- 程序设计: 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。(C#语言)
- 程序设计(猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒) [转载]
- 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒
- 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒
- 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒
- 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒
- 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒
- 程序设计: 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。
- 程序设计: 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。(C#控制台程序)
- 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。(C#语言)(观察者模式)
- 程序设计: 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。(C#语言)
- 转---猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒 [观察者模式]
- loner_li 机试题 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒。(C#语言)
- 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒
- 猫大叫一声,所有的老鼠都开始逃跑,主人被惊醒