c++设计模式--观察者模式
来源:互联网 发布:空总激光美容中心 知乎 编辑:程序博客网 时间:2024/06/05 01:54
// ObserverPattern.cpp : 定义控制台应用程序的入口点。
//通过此例程了解设计模式里的“观察者模式”
//观察者模式:定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象,这个主题对象在状态发生变化时,
//会通知所有观察者对象,使他们能够自动更新自己
//下面采用学生上课时的情形来解释这一模式
//学生上课时,老师因为临时有事,不能来上课,要班主任来监督
//班主任也不能时刻都监督学生,所以采用抽空检查的方式
//班主任要求学生要自己在教室内看书,但是看不看书还是我们说的算
//所以在班主任走后,一部分人开始看手机
//一部份人开始聊天
//一部分人。。。
//为了怕被班主任捉到,这些人就叫坐在门旁边的同学多多注意,如果发现班主任来了,就提前打个招呼
//这个情形,学生都是观察者,班主任是主题对象,多对一,学生的状态随班主任的状态而改变
#include "stdafx.h"#include <string>#include <process.h>//for call system("pause")#include <iostream>#include <vector>//from STL,for save infousing namespace std;//观察者类class CObserver;//抽象通知者,坐在门旁边的那个学生或者班主任class CSubject{public: CSubject() { } virtual ~CSubject() { }public: virtual void Attatch(CObserver *o)=0; virtual void Detach(CObserver *o)=0; virtual void Notify()=0; virtual string GetState()=0; virtual void SetState(string state)=0;protected: string m_state;}; //抽象观察者实现class CObserver{public: CObserver(string name,CSubject *sub) { this->m_name=name; this->m_sub=sub; } virtual ~CObserver() { }public: virtual void Update()=0;protected: string m_name; CSubject *m_sub;};//具体的观察者,玩手机的学生class CPlayPhoneStudent:public CObserver{public: CPlayPhoneStudent(string name,CSubject *sub):CObserver(name,sub) { } ~CPlayPhoneStudent() { }public: void Update() { cout<<m_sub->GetState()<<" "<<m_name<<"快点关掉手机"<<endl; }};//具体的观察者,聊天的学生class CChatStudent:public CObserver{public: CChatStudent(string name,CSubject *sub):CObserver(name,sub) { } ~CChatStudent() { }public: void Update() { cout<<m_sub->GetState()<<" "<<m_name<<"闭上你们的嘴"<<endl; }};//具体的通知者,坐在门口的那个学生class CSpecialStudent:public CSubject{public: CSpecialStudent() { m_observer=new vector<CObserver*>; } ~CSpecialStudent() { }public: void Attatch(CObserver *o) { this->m_observer->push_back(o); } void Detach(CObserver *o) { for (vector<CObserver*>::iterator it=m_observer->begin();it!=m_observer->end();it++) { if (*it==o) { this->m_observer->erase(it); } } } void Notify() { for (vector<CObserver*>::iterator it=m_observer->begin();it!=m_observer->end();it++) { (*it)->Update(); } } string GetState() { return m_state; } void SetState(string state) { m_state=state; }private: vector<CObserver*> *m_observer;};int _tmain(int argc, _TCHAR* argv[]){ CSpecialStudent *t=new CSpecialStudent(); CPlayPhoneStudent *p=new CPlayPhoneStudent("天策",t); CPlayPhoneStudent *p1=new CPlayPhoneStudent("张三",t); CChatStudent *c=new CChatStudent("李四",t); t->Attatch(p); t->Attatch(p1); t->Attatch(c); t->SetState("班主任回来了!"); t->Notify(); system("pause"); return 0;}
- 设计模式--观察者模式(C++)
- 设计模式--观察者模式(C++)
- 学习设计模式--观察者模式(C++)
- 设计模式--观察者模式(C++)
- 学习设计模式--观察者模式(C++)
- 设计模式----观察者模式Observer(C++)
- 设计模式之观察者模式(C++)
- 设计模式---观察者模式(C++)
- 设计模式之观察者模式(c++)
- 模式设计:观察者模式
- 设计模式-----观察者模式
- 设计模式-观察者模式
- 设计模式--观察者模式
- 设计模式:观察者模式
- 设计模式-----观察者模式
- 设计模式:观察者模式
- 设计模式-观察者模式
- 设计模式 观察者模式
- 用html5实现的购物车拖拽特效
- 修改mantis显示为中文页面
- 简单的Tween动画
- C/C++常用头文件及函数汇总
- Jump Game II
- c++设计模式--观察者模式
- How to think like a Computer Scientist: 课后习题第十七章4
- toj3071 BFS_模板
- 0915土豆视频之"_CGImageSourceCopyPropertiesAtIndex", referenced from:
- PHP结合JAVA的开发技术 LAJP
- 关于MotionEvent.ACTION_UP无法被响应的问题
- 乐杨俊:div实现阴影效果(适应各个浏览器)
- OGR读取GML文件
- 表连接