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

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值