观察者模式

来源:互联网 发布:淘宝买家订单数据诈骗 编辑:程序博客网 时间:2024/06/06 17:33

V0.1 传统方式

class StockTeammate{public:StockTeammate(std::string arg, Secretary& sec);void update();private:std::string name;};class Secretary{public:void add(StockTeammate& s);void alarm();private:std::vector<StockTeammate> teammate;};

StockTeammate::StockTeammate(string arg, Secretary& s):name(arg){s.add(*this);}void StockTeammate::update(){cout<<name<<" close stock and go to work"<<endl;}void Secretary::add(StockTeammate& s){teammate.push_back(s);}void Secretary::alarm(){vector<StockTeammate>::iterator it = teammate.begin();while(it!= teammate.end()){it->update();it++;}}

V0.2 对于听众进行抽象

class Teammate{public:Teammate();Teammate(std::string arg, Secretary& sec);virtual ~Teammate();virtual void update()=0;protected:std::string name;};class StockTeammate:public Teammate{public:StockTeammate(std::string arg, Secretary& sec);void update();};class NbaTeammate:public Teammate{public:NbaTeammate(std::string arg, Secretary& sec);void update();};class Secretary{public:void add(Teammate& s);void alarm();private:std::vector<Teammate*> teammate;};

Teammate::Teammate(){}Teammate::Teammate(string arg, Secretary& s):name(arg){s.add(*this);}Teammate::~Teammate(){}StockTeammate::StockTeammate(string arg, Secretary& s):Teammate(arg, s){}void StockTeammate::update(){cout<<name<<" close stock and go to work"<<endl;}NbaTeammate::NbaTeammate(string arg, Secretary& s):Teammate(arg, s){}void NbaTeammate::update(){cout<<name<<" close NBA and go to work"<<endl;}void Secretary::add(Teammate& s){teammate.push_back(&s);}void Secretary::alarm(){vector<Teammate*>::iterator it = teammate.begin();while(it!= teammate.end()){(*it)->update();it++;}}

V0.3对于观察者进行抽象

class Observer;class Teammate{public:Teammate();Teammate(std::string arg, Observer& sec);virtual ~Teammate();virtual void update()=0;protected:std::string name;};class StockTeammate:public Teammate{public:StockTeammate(std::string arg, Observer& sec);void update();};class NbaTeammate:public Teammate{public:NbaTeammate(std::string arg, Observer& sec);void update();};class Observer{public:virtual ~Observer();void add(Teammate& t);virtual void alarm()=0;protected:std::vector<Teammate*> teammate;};class Secretary:public Observer{public:void alarm();};class Boss:public Observer{public:void alarm();};

Teammate::Teammate(){}Teammate::Teammate(string arg, Observer& s):name(arg){s.add(*this);}Teammate::~Teammate(){}StockTeammate::StockTeammate(string arg, Observer& s):Teammate(arg, s){}void StockTeammate::update(){cout<<name<<" close stock and go to work"<<endl;}NbaTeammate::NbaTeammate(string arg, Observer& s):Teammate(arg, s){}void NbaTeammate::update(){cout<<name<<" close NBA and go to work"<<endl;}Observer::~Observer(){}void Observer::add(Teammate& s){teammate.push_back(&s);}void Secretary::alarm(){cout<<"This is Secretary alarm!"<<endl;vector<Teammate*>::iterator it = teammate.begin();while(it!= teammate.end()){(*it)->update();it++;}}void Boss::alarm(){cout<<"This is Boss alarm!"<<endl;vector<Teammate*>::iterator it = teammate.begin();while(it!= teammate.end()){(*it)->update();it++;}}

执行文件

int main(){Secretary s;Boss b;StockTeammate st1("Tom", s);StockTeammate st2("Terry", b);NbaTeammate nt1("John", s);s.alarm();b.alarm();return 0;}



0 0
原创粉丝点击