【C/C++ 设计模式】(三)观察者模式(Observer)

编程入门 行业动态 更新时间:2024-10-11 19:24:02

【C/C++ 设计<a href=https://www.elefans.com/category/jswz/34/1771241.html style=模式】(三)观察者模式(Observer)"/>

【C/C++ 设计模式】(三)观察者模式(Observer)

观察者模式

使用场景or动机

  • 在软件构建过程中,我们需要为某些对象建立一种“通知依赖关系” —— 一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密,将使软件不能很好地抵御变化。
  • 使用面向对象技术,可以将这种依赖关系弱化,并形成一种稳定的依赖关系。从而实现软件体系结构的松耦合。

模式定义

定义对象间的一种一对多(变化)的依赖关系,以便当一个对象(Subject)的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。它是一种行为型模式。

结构

举例说明

#include <iostream>
#include <string>
#include <list>
using namespace std;class Subject;
//抽象观察者
class Observer
{
protected:string name;Subject* sub;
public:Observer(string name, Subject* sub){this->name = name;this->sub = sub;}virtual void update() = 0;
};
//具体的观察者,看股票的
class StockObserver :public Observer
{
public:StockObserver(string name, Subject* sub) :Observer(name, sub){}void update();
};
//具体的观察者,看NBA的
class NBAObserver :public Observer
{
public:NBAObserver(string name, Subject* sub) :Observer(name, sub){}void update();
};
//抽象通知者
class Subject
{
protected:list<Observer*> observers;
public:string action;virtual void attach(Observer*) = 0;virtual void detach(Observer*) = 0;virtual void notify() = 0;
};
//具体通知者,秘书
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){observers.erase(iter);}++iter;}}void notify(){list<Observer*>::iterator iter = observers.begin();while (iter != observers.end()){(*iter)->update();++iter;}}
};void StockObserver::update()
{cout << name << " 收到消息:" << sub->action << endl;if (sub->action == "梁所长来了!"){cout << "我马上关闭股票,装做很认真工作的样子!" << endl;}
}void NBAObserver::update()
{cout << name << " 收到消息:" << sub->action << endl;if (sub->action == "梁所长来了!"){cout << "我马上关闭NBA,装做很认真工作的样子!" << endl;}
}int main()
{Subject* dwq = new Secretary(); //创建观察者<br>    //被观察的对象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();return 0;
}

运行结果:

要点总结

  • 使用面向对象的抽象,Observer模式使得我们可以独立地改变目标与观察者,从而使二者之间的依赖关系达致松耦合。
  • 目标发送通知时,无需指定观察者,通知(可以携带通知信息作为参数)会自动传播。
  • 观察者自己决定是否需要订阅通知,目标对象对此一无所知。
  • Observer模式是基于事件的UI框架中非常常用的设计模式,也是 Model/View/Control(MVC)模式的一个重要组成部分。

更多推荐

【C/C++ 设计模式】(三)观察者模式(Observer)

本文发布于:2023-07-28 19:13:07,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1284056.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:模式   观察者   Observer

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!