【28】c++设计模式——>观察者模式(1)

编程入门 行业动态 更新时间:2024-10-19 18:36:53

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

【28】c++设计模式——>观察者模式(1)

观察者模式概念

C++观察者模式(Observer Pattern)是一种设计模式,它用于在对象之间建立一种一对多的依赖关系。在该模式中,当一个对象(称为主题)发生变化时,所有依赖于它的对象(称为观察者)都会得到通知并自动更新。

观察者模式通常包含以下几个角色:

主题(Subject):也称为被观察者或可观察对象,它维护一个观察者列表并提供添加、删除和通知观察者的方法。
观察者(Observer):定义一个更新接口,使得在主题状态改变时能够得到通知。
具体主题(ConcreteSubject):实现主题接口,具体主题对象在状态变化时通知观察者。
具体观察者(ConcreteObserver):实现观察者接口,具体观察者对象在接收到通知后进行相应的更新操作。

在C++中实现观察者模式可以使用以下步骤:

(1)定义主题接口 Subject,包括添加观察者、删除观察者和通知观察者的方法。
(2)定义观察者接口 Observer,包括更新方法。
(3)实现具体主题类 ConcreteSubject,维护观察者列表,实现添加观察者、删除观察者和通知观察者的方法。
(4)实现具体观察者类 ConcreteObserver,实现更新方法。
(5)在使用时,创建具体主题对象和具体观察者对象,并将观察者注册到主题中。
当具体主题对象的状态发生变化时,他会变量观察者列表,调用观察者的更新方法,从而实现观察者模式的效果。这样观察者就能根据主题的状态进行相应的操作,实现对象之间的松耦合关系。
观察者也叫订阅者,主题也叫发布者,谁发布,谁订阅,发布者维护一个订阅者列表,想订阅的人被添加到该列表中,每当要发布消息时,发布者就会轮询这个列表,订阅者就会收到消息。

实例代码

#include<iostream>
#include<vector>
using namespace std;//抽象观察者接口
class Observer
{
public:virtual void recive(int data) = 0; //订阅者的接受方法,用来接受发布者消息
};//具体订阅者A
class ConcreteObserverA : public Observer
{
public:void recive(int data) override{cout << "i am A,i accept data:" << data << endl;}
};//具体订阅者A
class ConcreteObserverB : public Observer
{
public:void recive(int data) override{cout << "i am B,i accept data:" << data << endl;}
};//抽象发布者
class Subscribe
{
public:virtual void attach(Observer* observer) = 0; //添加观察者,将观察者添加到列表中,纯虚函数virtual void detach(Observer* observer) = 0; //删除观察者,将观察者从列表中删除,纯虚函数virtual void notify(int data) = 0; //通知观察者
};//具体发布者
class SubscribeS : public Subscribe
{
private:vector<Observer*> observers; //存储观察者列表
public:void attach(Observer* observer) override//添加观察者,将观察者添加到列表中,纯虚函数{observers.push_back(observer);}void detach(Observer* observer) //删除观察者,将观察者从列表中删除,纯虚函数{for (auto &it : observers){auto it = std::find(observers.begin(), observers.end(), observer);if (it != observers.end()){observers.erase(it);}}}void notify(int data) //通知观察者{for (auto& it : observers){it->recive(data);}}
};int main()
{SubscribeS s;ConcreteObserverA a;ConcreteObserverB b;s.attach(&a);s.attach(&b);s.notify(123456);s.detach(&b);s.notify(33333333333333333);return 0;
}

更多推荐

【28】c++设计模式——>观察者模式(1)

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

发布评论

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

>www.elefans.com

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