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,现在没接触到,先这样吧。。。

  • 相关阅读:
    js日期时间补零
    判断交换机性能好坏的九个因素
    [转]document.getElementById("...") is null
    ABAP数据库操作之操作语句Insert
    abap对excel处理
    选择屏幕搜索帮助
    Screen返回选择界面的问题
    ABAP 的TABLE CONTROL实践积累
    ALV的双击使用
    双击ALV调用事务代码并传入参数
  • 原文地址:https://www.cnblogs.com/gattaca/p/4737399.html
Copyright © 2011-2022 走看看