设计模式C++实现笔记

OBSERVER观察者模式(行为模式)

2019-03-14  本文已影响0人  lixin_karl

介绍

定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。

参与者

实现代码

class Subject;
class Observer{
public:
    virtual void Update() = 0;
};
class Subject{
public:
    virtual void AddObserver(Observer* o)=0;
    virtual void DelObserver(Observer* o)=0;
    virtual void setState(int a) = 0;
    virtual int getState() = 0;

};
class ConcreteSubject : public Subject {
public:
    void AddObserver(Observer* o) override
    {
        l.push_back(o);
    }
    void DelObserver(Observer* o) override
    {
        l.remove(o);
    }
    void setState(int a)
    {
        state = a;
        NotifyAll();
    }
    int getState() override
    {
        return state;
    }
private:
    void NotifyAll()
    {
        for(auto item : l)
        {
            item->Update();
        }
    }
    int state = 0;
    std::list<Observer *> l;
};

class ObserverA:public  Observer{
public:
    explicit ObserverA(Subject *subject1)
    {
        subject = subject1;
        this->subject->AddObserver(this);
    }
    void Update() override
    {
        std::cout<<"Update A After Subject State Changed To "<<subject->getState()<<std::endl;
    }

private:
    Subject *subject;
};
class ObserverB:public  Observer{
public:
    explicit ObserverB(Subject *subject1)
    {
        subject = subject1;
        this->subject->AddObserver(this);
    }
    void Update() override
    {
        std::cout<<"Update B After Subject State Changed To "<<subject->getState()<<std::endl;
    }
private:
    Subject *subject;
};

int main()
{
    Subject *subject = new ConcreteSubject();
    Observer *a = new ObserverA(subject);
    Observer *b = new ObserverB(subject);

    subject->setState(22);
    std::cout<<"------------------------------------------"<<std::endl;
    subject->setState(35);
    return 0;
}

输出结果

Update A After Subject State Changed To 22
Update B After Subject State Changed To 22
------------------------------------------
Update A After Subject State Changed To 35
Update B After Subject State Changed To 35

特点

参考

上一篇 下一篇

猜你喜欢

热点阅读