zoukankan      html  css  js  c++  java
  • 观察者模式(observer pattern)

    观察者模式:

        定义了subject和observer之间的一对多依赖,当subject状态改变时,所有的observer都会收到通知。

    结构图:

    C++实现:

    class Observer;
    
    class Subject {
    public:
        virtual void attach(Observer *o) = 0;
        virtual void detach(Observer *o) = 0;
        virtual void notify() = 0;
    };
    
    class Observer {
    public:
        virtual void update(int val) = 0;
    };
    
    class mySubject : public Subject {
    private:
        set<Observer*> obs;
        int value;
    public:
        void attach(Observer *o) { obs.insert(o); }
        void detach(Observer *o) { obs.erase(o); }
        void setVaule(int val) {
            value = val;
            notify();
        }
        void notify()
        {
            set<Observer*>::iterator it;
            for (it = obs.begin(); it != obs.end(); ++it)
            {
                (*it)->update(value);
            }
        }
        int getValue() { return value; }
    };
    
    
    class observerA : public Observer {
    private:
        int value;
        Subject *psj;
    public:
        observerA(Subject *p): psj(p) { psj->attach(this); }
        void update(int val)
        {
            value = val;
            display();
        }
        void display()
        {
            printf("current value: %d
    ", value);
        }
        ~observerA() { delete psj; }
    };
    
    class observerB : public Observer {
    private:
        Subject *psj;
    public:
        observerB(Subject *p): psj(p) { psj->attach(this); }
        void update(int val)
        {
            if (val > 0)
                printf("good news
    ");
            else
                printf("bad news
    ");
        }
        ~observerB() { delete psj; }
    };
    
    int main()
    {
        mySubject subj;
        observerA a(&subj);
        observerB b(&subj);
        subj.setVaule(1);
        subj.detach(&a);
        subj.setVaule(2);
    }

    观察者模式涉及到的一个设计原则是:松耦合设计。改变subject或observer其中一方,并不会影响另一方。只要它们之间的接口仍被遵守,我们就可以自由地改变它们。

    PS:

       观察者模式的一个例子是MVC,现在没接触到,先这样吧。。。

  • 相关阅读:
    e.printStackTrace()打印在哪里以及如何e.printStackTrace()的内容打印在日志中
    oracle分组并在组内排序
    Java.util.Calendar类
    oracle分页查询
    两个map合并
    【自动化测试】无需图形界面环境下的浏览器开源项目
    【运维工具】logrotate 日志管理神器
    如何查看google chrome 插件源码
    phpexcel 读取数据
    常用开发资源收集
  • 原文地址:https://www.cnblogs.com/gattaca/p/4737399.html
Copyright © 2011-2022 走看看