• 观察者模式


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

    效果:

  • 相关阅读:
    transitiondrawable ImageVIew切换动画
    Android硬件加速
    android PorterDuffXfermode ,PorterDuff.Mode 使用 以及Porter-Duff规则详解
    listview 打对号效果实现
    nrf52832 连接参数更新过程
    Makefile 学习记录一
    W25Q128BV W25Q128FV W25Q128JV 什么区别?
    lwip Packet buffers (PBUF) API 操作 集合
    NRF SDK 中 , C语言 的 一些骚操作 ,记录下
    lwip lwiperf 方法进行性能测试 4.5MB/S
  • 原文地址:https://www.cnblogs.com/hupeng1234/p/6877732.html
Copyright © 2020-2023  润新知