码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式初探2——观察者模式(Observer Pattern)

时间:2014-11-03 10:12:13      阅读:203      评论:0      收藏:0      [点我收藏+]

标签:c++   设计模式   软件开发   设计模式初探   观察者模式   

观察者模式:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。


典型使用情况:某个对象掌握数据,当数据更新时通知多个对象更新显示(参考MVC)。

在java内置的Observer模式中支持“push”和“pull”两种方式,一般好像push更多一点,下面就以push为例:


UML图:

bubuko.com,布布扣


依然上一段测试代码:

#include <iostream>
#include <algorithm>
#include <list>

using namespace std;

class Observer {
public:
    virtual void update(string str) = 0;
};

class Subject {
public:
    virtual void registerObserver(Observer*) = 0;
    virtual void removeObserver(Observer*) = 0;
    virtual void notifyObserver() = 0;
};
// 显示数据接口
class Display {
public:
    virtual void display() = 0;
};

class SubjectImpl : public Subject {
public:
    SubjectImpl(){
        info = "123";
    }

    void registerObserver(Observer* o){
        observers.push_back(o);
    }

    void removeObserver(Observer* o)
    {
        list<Observer*>::iterator it = find(observers.begin(), observers.end(), o);
        if ( it != observers.end() )
            observers.remove(o);
    }

    void notifyObserver(){
        list<Observer*>::iterator it = observers.begin();
        while(it != observers.end()) {
            (*it)->update(info);
            ++it;
        }
    }
    // 模拟数据发生改变
    void dataChanged(){
        info = "456";
        notifyObserver();
    }

private:
    list<Observer*> observers;
    string info;
};

class ObserverImpl : public Observer, public Display{
public:
    ObserverImpl(Subject* sub){
        mySubject = sub;
        mySubject->registerObserver(this);
    }

    void update(string str)
    {
        data = str;
        display();
    }

    void display()
    {
        cout << data << endl;
    }

private:
    Subject* mySubject;
    string data;
};

int main()
{
    SubjectImpl *impl = new SubjectImpl();
    ObserverImpl *obimpl = new ObserverImpl(impl);
    impl->dataChanged();
    return 0;
}


设计模式初探2——观察者模式(Observer Pattern)

标签:c++   设计模式   软件开发   设计模式初探   观察者模式   

原文地址:http://blog.csdn.net/cloud_castle/article/details/40717189

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!