首页 > 代码库 > 观察者模式
观察者模式
一、简介
1、观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一主题对象。这个主题对象在状态发生变化的时候,会通知所有观察者对象,使它们能够动态的更新自己。
2、模式中的角色
抽象主题(Subject):它把所有观察者对象的引用保存到一个List,每个主题都可以有任何数量的观察者。抽象主题提供一个接口,可以增加和删除观察者对象。
具体主题(ConcreteSubject):将有关状态存入具体观察者对象;在具体主题内部状态改变时,给所有登记过的观察者发出通知。
抽象观察者(Observer):为所有的具体观察者定义一个接口,在得到主题通知时更新自己。
具体观察者(ConcreteObserver):实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题状态协调。
二、C++程序
下面以老师上课点名为例写一个观察者的程序,小尹和小胥两位同学都要一个去上课的同学帮忙老师是否点名,如果点名了就跑去上课,否则泡实验室学习。
1 // 观察者模式.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 #include<iostream> 6 #include <list> 7 #include<string> 8 using namespace std; 9 class Observer10 {11 public:12 Observer(){}13 virtual ~Observer(){}14 virtual void update(){}15 };16 //抽象主题17 class Subject18 {19 private:20 typedef list<Observer* >LIST; //观察者链表 21 LIST observers;22 protected:23 string subjectstate;24 public:25 Subject(){}26 virtual ~Subject(){}27 void add_observer(Observer *observer) //添加观察者28 {29 observers.push_back(observer);30 }31 void remove_observer(Observer *observer)//删除观察者32 {33 observers.remove(observer); 34 }35 virtual void set_subjectstate(string )=0;//设置当前主题的状态36 virtual string get_subjectstate()=0;//观察当前主题的状态37 void notify()38 {39 LIST::iterator node = observers.begin(); 40 for(; node != observers.end(); node++) 41 {42 (*node)->update(); 43 }44 }45 };46 47 class Concretesubject:public Subject48 { 49 public:50 Concretesubject (){}51 virtual~Concretesubject (){}52 virtual void set_subjectstate(string s)53 {54 subjectstate=s;55 }56 virtual string get_subjectstate()57 {58 return subjectstate;59 }60 };61 62 class Concereteobserver:public Observer63 {64 private:65 Subject * subject;66 public:67 Concereteobserver(Subject *s)68 {69 subject=s;70 }71 ~Concereteobserver(){}72 void update()73 {74 string state=subject->get_subjectstate();75 if(state=="点名了")76 {77 cout<<"赶紧跑去上课"<<endl;78 }79 if(state=="正常上课")80 {81 cout<<"继续泡实验室"<<endl;82 }83 }84 };85 int _tmain(int argc, _TCHAR* argv[])86 {87 //创建一个具体的主题,上课老师是否点名88 Subject *dianming=new Concretesubject();89 //创造两个人 小尹和小胥90 Observer * xiaoyin=new Concereteobserver(dianming);91 Observer * xiaoxu=new Concereteobserver(dianming);92 //将小尹和小胥两个人注册为该主题的观察者93 dianming->add_observer(xiaoyin);94 dianming->add_observer(xiaoxu);95 //该主题发生变化的时候,自动通知他们,然后他们采取措施96 dianming->set_subjectstate("点名了");97 dianming->notify();98 return 0;99 }
观察者模式
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。