设计模式之观察者模式-C++

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

通过观察者定义我们可以知道,有一个对象,他会提供数据,另外还有很多对象,他们需要这些数据来进行各自的活动。下面我们以一个天气情况为例来对观察者模式进行描述。

我们有许多部门需要获取我们天气情况,他们是我们的观察者。而天气是我们的被观察者,当我们的天气发生改变时,我们需要告诉所有的观察者。

在观察者模式中,我们需要以下几个类:

一、主题类。主要实现注册观察者,数据发生改变时通知观察者,注销观察者。

class SubjectFather

{

        public:

        void registerObserver(ObserverFather *ob); //注册观察者

        void removeObserver(ObserverFather *ob); //注销观察者

        void notifyObserver(); //通知观察者

        private:

        std::vector<ObserverFather *> m_observerVector; //存放各个注册的观察者对象。

};

void SubjectFather::registerObserver(ObserverFather *ob)

{

        m_observerVector.push_back(ob);

}

void SubjectFather::notifyObserver() //通知观察者

{

        std::vector<ObserverFather *>::iterator iter;

        for(iter = m_observerVector.begin();iter!=m_observerVector.end();iter++)

                (*iter)->updata();//调用各个观察者的updata 函数进行处理。

}

二、抽象的观察者基类。主要作用为:通过父类来指向不同的子类,明确主题发生变化时,通过updata来传递到各个观察者。这是主题和子观察者都要用到的类,主题主要用它来指向各个子观察者,子观察者主要是继承它。

class ObserverFather

{

        public:

        ObserverFather(){}

        ~ObserverFather(){}

        virtual void updata() = 0;//可以考虑把数据封装成类,这里传入封装类的对象,在各个具体的观察者中,可以通过数据类来获取相应的数据

};

三、继承观察者基类的具体观察者。

class FirstObserver : public ObserverFather

{

        public:

        FirstObserver(SubjectFather *subject); //构造对象完成时,就把这个对象注册到 主题中。

        ~FirstObserver(SubjectFather *subject); //在主题中注销这个对象

        void updata();

};

FirstObserver::FirstObserver(SubjectFather *subject)

{

        subject->registerObserver(this); //注册

}

 void FirstObserver::updata()

  {

        //收到通知,执行具体的操作

   }

四、简单示例:

 int main()

{

        SubjectFather *subject = new SubjectFather();

        FirstObserver *first = new FirstObserver(subject);

        subject->notifyObserver(); //主题更改时,通知各个观察者

        return 0;

}

猜你喜欢

转载自blog.csdn.net/dreamliweiming/article/details/127843637