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;}