zoukankan      html  css  js  c++  java
  • 观察者模式

    观察者(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;
    }

    效果:

  • 相关阅读:
    VTK 体绘制讨论_光照&阴影、VTKLODProp3D
    VTK 体绘制讨论_颜色传输函数
    VTK 体绘制讨论_梯度不透明度传输函数
    VTK 体绘制讨论_不透明度传输函数
    VTK 体绘制裁剪_Cripping技术
    VTK 体绘制裁剪_Cropping技术
    VTK 纹理映射体绘制_三维纹理映射
    VTK 纹理映射体绘制_二维纹理映射
    VTK 体绘制_固定点光线投影体绘制与GPU加速光线投影体绘制
    VTK 体绘制_光线投影+最大密度投影+等值面法
  • 原文地址:https://www.cnblogs.com/hupeng1234/p/6877732.html
Copyright © 2011-2022 走看看