Observer模式

来源:互联网 发布:注会考试网络培训哪好 编辑:程序博客网 时间:2024/06/06 12:53

Observer模式是开发中,使用比较多的模式之一.Observer模式叫做观察者模式,它定义了一种一对多的依赖模式,让多个观察者同时监听某一对象状态,当这个对象状态发生变化时,这些观察者都得到通知.

下图即为Observer模式的类图:
这里写图片描述

实现如下:
//Subject.h

//Subject.h#ifndef _SUBJECT_H_#define _SUBJECT_H_#include <string>#include <boost/ptr_container/ptr_container.hpp>typedef std::string State;class Observer;class Subject{public:    virtual ~Subject();    virtual void Attach(Observer* obv);    virtual void Detach(Observer* obv);    virtual void Notify();    virtual void SetState(const State& st) = 0;    virtual State GetState() = 0;protected:    Subject();private:    boost::ptr_vector<Observer> obvs_;};class ConcreteSubject : public Subject{public:    ConcreteSubject();    ~ConcreteSubject();    State GetState();    void SetState(const State& st);private:    State st_;};#endif

//Subject.cpp

//Subject.cpp#include "Subject.h"#include "Observer.h"#include <iostream>Subject::Subject(){}Subject::~Subject(){}void Subject::Attach(Observer* obv){    obvs_.push_back(obv);}void Subject::Detach(Observer* obv){    for(boost::ptr_vector<Observer>::iterator iter=obvs_.begin(); iter!=obvs_.end(); ++iter)    {        if(obv==&(*iter))        {            obvs_.erase(iter);//dead loop????            break;        }    }    return ;}void Subject::Notify(){    for(boost::ptr_vector<Observer>::iterator iter=obvs_.begin(); iter!=obvs_.end(); ++iter)    {        iter->Update(this);    }}ConcreteSubject::ConcreteSubject(){    st_='\0';}ConcreteSubject::~ConcreteSubject(){}void ConcreteSubject::SetState(const State& st){    st_=st;}State ConcreteSubject::GetState(){    return st_;}

//Observer.h

#ifndef _OBSERVER_H_#define _OBSERVER_H_#include "Subject.h"#include <string>typedef std::string State;class Observer{public:    virtual ~Observer();    virtual void Update(Subject* sub)=0;    virtual void PrintInfo()=0;protected:    Observer();    State st_;};class ConcreteObserverA:public Observer{public:    virtual ~ConcreteObserverA();    ConcreteObserverA(Subject* sub);    virtual Subject* GetSubject();    void Update(Subject* sub);    void PrintInfo();private:    Subject* sub_;};class ConcreteObserverB:public Observer{public:    virtual ~ConcreteObserverB();    ConcreteObserverB(Subject* sub);    virtual Subject* GetSubject();    void Update(Subject* sub);    void PrintInfo();private:    Subject* sub_;};#endif //_OBSERVER_H_

//Observer.cpp

//Observer.cpp#include "Observer.h"#include "Subject.h"#include <iostream>#include <string>Observer::Observer(){    st_='\0';}Observer::~Observer(){}ConcreteObserverA::ConcreteObserverA(Subject* sub){    sub_=sub;    sub_->Attach(this);}ConcreteObserverA::~ConcreteObserverA(){    sub_->Detach(this);    //if(sub_!=0)        //delete sub_;}Subject* ConcreteObserverA::GetSubject(){    return sub_;}void ConcreteObserverA::PrintInfo(){    std::cout<<"ConcreteObserverA observer "<<st_<<std::endl;}void ConcreteObserverA::Update(Subject* sub){    st_=sub->GetState();    PrintInfo();}ConcreteObserverB::ConcreteObserverB(Subject* sub){    sub_=sub;    sub_->Attach(this);}ConcreteObserverB::~ConcreteObserverB(){    sub_->Detach(this);    //if(sub_!=0)        //delete sub_;}Subject* ConcreteObserverB::GetSubject(){    return sub_;}void  ConcreteObserverB::PrintInfo(){    std::cout<<"ConcreteObserverB observer "<<st_<<std::endl;}void ConcreteObserverB::Update(Subject* sub){    st_=sub->GetState();    PrintInfo();}

//main.cpp

#include "Subject.h"#include "Observer.h"int main(){    ConcreteSubject* sub=new ConcreteSubject();    Observer* o1=new ConcreteObserverA(sub);    Observer* o2=new ConcreteObserverB(sub);    sub->SetState("old");    sub->Notify();    sub->Detach(o1);    sub->SetState("new");    sub->Notify();    return 0;}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 主持时说错话了怎么办 小鲜肉老了不红怎么办 同学聚会大家玩手机你怎么办 率土之滨被掠夺怎么办 戒指戴手上取不下来怎么办 择离开我我该怎么办 解小手解不出来怎么办 学生把班里的班费弄丢了怎么办 班里选的班长成绩差怎么办 幼儿园班里孩子发生传染病怎么办 小仓鼠生了该怎么办 把老公生日忘了怎么办 老公说老婆脑子不好怎么办 和上司暧昧被同事发现怎么办 减肥不吃晚餐饿了怎么办 小孩晚饭吃多了怎么办 减肥晚上不吃饭饿了怎么办 两个人在一起性格不合怎么办 赌在你身上输了怎么办 苹果7lcould满了怎么办 e招贷不用了怎么办 牙活动了怎么办还疼 30岁掉了一颗牙怎么办? 在淘宝上交话费交错了怎么办 演出队在小区旁边扰民怎么办 雷雨天加了油怎么办 戴ok镜眼睛重影怎么办 乌龟背上长白色的花纹怎么办? 全自动洗衣机里面掉个硬币怎么办 跆拳道课上孩子乱动说话怎么办? 孩子不愿意上跆拳道课了怎么办 车座位里面倒了汤怎么办 腿被棍子打肿了怎么办 刚买的手机碎屏怎么办 被木棍么么打到头项怎么办 大王卡用到40g怎么办 王卡40g用完了怎么办 父亲把母亲打成重伤怎么办 狗狗脖子摔歪了怎么办 吃鸡游戏中重伤怎么办 吃鸡游戏摔伤了怎么办