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

本文介绍了观察者模式的概念,它定义了一对多的依赖关系,当一个对象的状态改变时,所有依赖它的对象都会得到通知并自动更新。以天气预报为例,多个部门作为观察者,天气作为被观察者,当天气变化时,所有部门都会接收到通知。文章通过代码展示了如何实现观察者模式,包括主题类、抽象观察者基类和具体观察者的定义及交互过程。
摘要由CSDN通过智能技术生成

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

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

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

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

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

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;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dreamliweiming

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值