每天一个设计模式: 观察者模式(Observer)

来源:互联网 发布:免费换ip软件 编辑:程序博客网 时间:2024/04/30 01:44
#ifndef SUBJECT_H#define SUBJECT_H#include <list>#include <string>using namespace std;typedef 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:    std::list<Observer*> *_obvs;};class ConcreteSubject:public Subject{public:    ConcreteSubject();    ~ConcreteSubject();    State GetState();    void SetState(const State &st);protected:private:    State _st;};#endif // SUBJECT_H


#include "subject.h"#include "observer.h"#include <iostream>using namespace std;Subject::Subject(){    this->_obvs = new list<Observer*>;}Subject::~Subject(){}void Subject::Attach(Observer *obv){    this->_obvs->push_front(obv);}void Subject::Detach(Observer *obv){    if(!obv)    {        this->_obvs->remove(obv);    }}void Subject::Notify(){    list<Observer*>::iterator it;    it = this->_obvs->begin();    for(; it != this->_obvs->end(); it++)    {        (*it)->Update(this);    }}ConcreteSubject::ConcreteSubject(){    this->_st = '\0';}ConcreteSubject::~ConcreteSubject(){}State ConcreteSubject::GetState(){    return this->_st;}void ConcreteSubject::SetState(const State &st){    this->_st = st;}


</pre><pre code_snippet_id="1552113" snippet_file_name="blog_20160108_4_4904124" name="code" class="html">

#ifndef OBSERVER_H#define OBSERVER_H#include "subject.h"#include <string>using namespace std;typedef string State;class Observer{public:    virtual ~Observer();    virtual void Update(Subject* sub) = 0;    virtual void PrintInfo() = 0;protected:    Observer();    State _st;private:};class ConcreteObserver: public Observer{public:    virtual Subject* GetSubject();    ConcreteObserver(Subject* sub);    virtual ~ConcreteObserver();    void Update(Subject *sub);    void PrintInfo();protected:private:    Subject* _sub;};#endif // OBSERVER_H



#include "observer.h"#include <iostream>Observer::Observer(){    this->_st = '\0';}Observer::~Observer(){}ConcreteObserver::ConcreteObserver(Subject* sub){    this->_sub = sub;    this->_sub->Attach(this);}ConcreteObserver::~ConcreteObserver(){    this->_sub->Detach(this);}Subject* ConcreteObserver::GetSubject(){    return this->_sub;}void ConcreteObserver::PrintInfo(){    std::cout<<"ConcreteObserver state: " <<this->_st<<std::endl;}void ConcreteObserver::Update(Subject *sub){    this->_st = sub->GetState();    PrintInfo();}

#include <iostream>using namespace std;#include "subject.h"#include "observer.h"#include <iostream>#include <stdio.h>using namespace std;int main(){    ConcreteSubject* sub = new ConcreteSubject();    Observer* o1 = new ConcreteObserver(sub);    Observer* o2 = new ConcreteObserver(sub);    sub->SetState("old");    sub->Notify();    sub->SetState("new");    sub->Notify();    delete o1;    delete o2;    delete sub;    getchar();    return 0;}



0 0
原创粉丝点击