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

    1】什么是观察者模式?
    
    观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。
    
    这个主题对象在状态上发生变化时,会通知所有观察者对象,让他们能够自动更新自己 
    
    【2】观察者模式代码示例:
    
    代码示例如下:
    #include <iostream>
    #include <string>
    #include <list>
    using namespace std;
    
    class Observer;
    
    class Subject
    {
    protected:
        list<Observer*> observers;
    public:
        string action;
    public:
        virtual void attach(Observer*) = 0;
        virtual void detach(Observer*) = 0;
        virtual void notify() = 0;
    };
    
    class Observer
    {
    protected:
        string name;
        Subject *sub;
    public:
        Observer(string name, Subject *sub)
        {
            this->name = name;
            this->sub = sub;
        }
        string getName()
        {
            return name;
        }
        virtual void update() = 0;
    };
    
    class StockObserver : public Observer
    {
    public:
        StockObserver(string name, Subject *sub) : Observer(name, sub)
        {
        }
        void update();
    };
    
    void StockObserver::update()
    {
        cout << name << " 收到消息:" << sub->action << endl;
        if (sub->action == "梁所长来了!")
        {
            cout << "我马上关闭股票,装做很认真工作的样子!" << endl;
        }
    }
    
    class NBAObserver : public Observer
    {
    public:
        NBAObserver(string name, Subject *sub) : Observer(name, sub)
        {
        }
        void update();
    };
    
    void NBAObserver::update()
    {
        cout << name << " 收到消息:" << sub->action << endl;
        if (sub->action == "梁所长来了!")
        {
            cout << "我马上关闭NBA,装做很认真工作的样子!" << endl;
        }
    }
    
    class Secretary : public Subject
    {
        void attach(Observer *observer)
        {
            observers.push_back(observer);
        }
        void detach(Observer *observer)
        {
            list<Observer *>::iterator iter = observers.begin();
            while (iter != observers.end())
            {
                if ((*iter) == observer)
                {
                    cout << "erase:" << observer->getName() << endl;
                    observers.erase(iter++);
                }
                else
                {
                    ++iter;
                }
            }
        }
        void notify()
        {
            list<Observer *>::iterator iter = observers.begin();
            while (iter != observers.end())
            {
                (*iter)->update();
                ++iter;
            }
        }
    };
    
    
    int main()
    {
        Subject *dwq = new Secretary();
    
        Observer *xs = new NBAObserver("xiaoshuai", dwq);
        Observer *zy = new NBAObserver("zouyue", dwq);
        Observer *lm = new StockObserver("limin", dwq);
    
        dwq->attach(xs);
        dwq->attach(zy);
        dwq->attach(lm);
    
        dwq->action = "去吃饭了!";
        dwq->notify();
        cout << endl;
    
        dwq->action = "梁所长来了!";
        dwq->notify();
    
        dwq->detach(lm);
        dwq->detach(zy);
        dwq->detach(xs);
    
        return 0;
    }
  • 相关阅读:
    查看数据库所有的表
    oracle JOB学习(一)---基础
    图片实时预览JSP加js
    Collections.sort()
    FileUtil.java
    设计模式:常见类的关系
    枚举
    相册
    jQuery----blur()方法
    上传文件详解
  • 原文地址:https://www.cnblogs.com/leijiangtao/p/4534618.html
Copyright © 2011-2022 走看看