设计模式之观察者模式C++代码

来源:互联网 发布:h5页面动态软件 编辑:程序博客网 时间:2024/06/18 04:40

/////////  Observer.h

#ifndef dOBSR

#define dOBSR

class Observer
{
private:
public:
    virtual void Update() = 0;
};

#endif dOBSR

/////////  Subject.h

#ifndef dSUB
#define dSUB
#include <list>
#include "Observer.h"
using namespace std;

class Subject
{
private:
    list<Observer*> obsrList;
public:
    void Attach(Observer* obsr) { obsrList.push_back(obsr);};
    void Dettach(Observer* obsr)
    {
        list<Observer*>::iterator i;
        for(i=obsrList.begin();i!=obsrList.end();i++)
        {
            if((*i) == obsr)
                obsrList.erase(i);
        }
    };
    void Notify()
    {
        list<Observer*>::iterator i;
        for(i=obsrList.begin();i!=obsrList.end();i++)
        {
            (*i)->Update();
        }
    };
};

#endif dSUB


/////////////////ConcreteObserver.h

#ifndef dCO
#define dCO

#include "Observer.h"
#include "ConcreteSubject.h"
#include <iostream>
using namespace std;

class ConcreteObserver : public Observer
{
private:
    string ObsrName;
    string ObsrState;
    ConcreteSubject* subject;
public:
    ConcreteObserver(ConcreteSubject* sub,string name)
    {
        this->subject = sub;
        this->ObsrName = name;
    };
    void Update()
    {
        this->ObsrState = this->subject->getState();
        cout << "Observer:" << this->ObsrName << "'s state is:" << this->ObsrState << endl;
    };
};

#endif dCO


/////////////////ConcreteSubject.h

#ifndef dCS
#define dCS

#include "Subject.h"
#include <string>
using namespace std;

class ConcreteSubject : public Subject
{
private:
    string subState;
public:
    string getState() { return this->subState;};
    void setState(string state){ this->subState = state;};
};

#endif dCS


/////////////main.cpp

#include "ConcreteObserver.h"
#include "ConcreteSubject.h"

void main()
{
    ConcreteSubject* cs = new ConcreteSubject();
    ConcreteObserver* co1 = new ConcreteObserver(cs,"X");
    ConcreteObserver* co2 = new ConcreteObserver(cs,"Y");
    ConcreteObserver* co3 = new ConcreteObserver(cs,"Z");

    cs->Attach(co1);
    cs->Attach(co2);
    cs->Attach(co3);

    cs->setState("Hello!");
    cs->Notify();

    int a;
    cin >> a;
}