观察者模式

Posted wanlifeipeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了观察者模式相关的知识,希望对你有一定的参考价值。

观察者(Observer)模式也称为发布-订阅(publish-subscribe)模式,目标就是通知的发布者(发送通知),观察者就是通知的订阅者(接收通知,被通知)

意图: 定义对象间一对多的依赖关系,使得一个对象被改变,其他对象被更新

 

代码:

#include <iostream>
#include <list>
#include <bitset>
using namespace std;

class Subject;

class Observer
{
public:
    virtual ~Observer() {}
public:
    virtual void update(Subject *s) = 0;
};


class Subject
{
public:
    Subject()
    {
        _observers.clear();
        _state = 0;
    }

public:
    void addObserver(Observer *o)
    {
        _observers.push_back(o);
    }

    void removeObserver(Observer *o)
    {
        _observers.remove(o);
    }

    void notify()
    {
        for (list<Observer*>::iterator it = _observers.begin(); it != _observers.end(); ++it)
        {
            (*it)->update(this);
        }
    }

    void setState(int state)
    {
        if (_state != state)  // 状态改变
        {
            _state = state;
            notify();   // 发送通知
        }
    }
    int getState() const
    {
        return _state;
    }
private:
    list<Observer *> _observers;
    int _state;
};


class BinaryObserver : public Observer
{
public:
    virtual void update(Subject *s)
    {
        bitset<sizeof(int) * 8> bs(s->getState());
        cout << std::dec << s->getState() << "二进制表示: " << bs << endl;
    }
};

class HextObserver : public Observer
{
public:
    virtual void update(Subject *s)
    {
        cout << std::dec << s->getState() << "十六进制表示: " << std::hex << s->getState() << endl;
    }
};

class OctObserver : public Observer
{
public:
    virtual void update(Subject *s)
    {
        cout << std::dec << s->getState() << "八进制表示: " << std::oct << s->getState() << endl;
    }
};

void test()
{
    Subject *sub = new Subject;
    Observer *binaryObserver = new BinaryObserver;  // 二进制格式化数据
    Observer *octObserver = new OctObserver;   // 8进制格式化数据
    Observer *hexObserver = new HextObserver;  // 16进制格式化数据
    sub->addObserver(binaryObserver);
    sub->addObserver(octObserver);
    sub->addObserver(hexObserver);
    sub->setState(8);
    sub->setState(15);
    sub->removeObserver(octObserver);  // 移除8进制格式化数据
    sub->setState(20);
    
    delete sub;
    delete binaryObserver;
    delete octObserver;
    delete hexObserver;

}

int main()
{
    test();
    cin.get();
    return 0;
}

效果:

 

以上是关于观察者模式的主要内容,如果未能解决你的问题,请参考以下文章

未调用 LiveData 观察者

Java设计模式补充:回调模式事件监听器模式观察者模式(转)

如何为片段设置观察者

永远观察实时数据的片段

设计模式观察者模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )

观察者模式