C++筹划模式(观察者模式)

[复制链接]
发表于 2026-1-27 07:43:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
观察者模式是一种软件筹划模式。
一、界说与概念

        在观察者模式中,存在被观察的对象(主题)和观察这个对象的观察者。主题在自身状态发生厘革时,会关照全部注册的观察者,让它们可以或许做出相应的反应。
二、作用与上风


  • 1. 解耦:主题和观察者之间的依靠关系被弱化,它们之间通过抽象接口举行交互,使得两边的厘革不会直接影响到对方,进步了体系的可维护性和可扩展性。
  • 2. 机动性:可以在运行时动态地添加、删除观察者,方便体系的扩展和维护。
  • 3. 进步相应性:当主题状态发生厘革时,可以或许及时关照全部观察者,使得体系可以或许快速做出反应。
三、应用场景


  • 1. 图形用户界面:比方按钮的点击变乱可以被多个组件观察,当按钮被点击时,这些组件可以做出相应的反应。
  • 2. 消息关照体系:当有新消息时,关照全部订阅了该消息的用户。
  • 3. 股票生意业务体系:股票代价厘革时,关照全部关注该股票的投资者。
四、代码实现

        观察者模式重要涉及到两个脚色:观察者(Observer)和被观察对象(Subject)。以下是观察者模式的类图形貌:
一、被观察对象(Subject)

属性:

  • 通常有一个或多个观察者列表,用于存储注册的观察者对象。
方法:

  • attach(Observer observer):用于将观察者添加到观察者列表中。
  • detach(Observer observer):从观察者列表中移除指定的观察者。
  • notifyObservers():当被观察对象的状态发生厘革时,关照全部注册的观察者。
二、观察者(Observer)

• 方法:

  • update():当被观察对象状态厘革时,被观察对象会调用此方法关照观察者,观察者在这个方法中举行相应的处置惩罚。
        观察者模式通过这种方式实现了对象之间的一对多依靠关系,当被观察对象的状态发生厘革时,全部依靠它的观察者都会收到关照并举行相应的更新。
 以下是用 C++实现观察者模式的示例代码:
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. // 抽象观察者类
  5. class Observer {
  6. public:
  7.     virtual void update() = 0;
  8. };
  9. // 抽象主题类
  10. class Subject {
  11. public:
  12.     virtual void attach(Observer* observer) = 0;
  13.     virtual void detach(Observer* observer) = 0;
  14.     virtual void notify() = 0;
  15. };
  16. // 具体主题类
  17. class ConcreteSubject : public Subject {
  18. private:
  19.     int state;
  20.     std::vector<Observer*> observers;
  21. public:
  22.     ConcreteSubject() : state(0) {}
  23.     void setState(int newState) {
  24.         state = newState;
  25.         notify();
  26.     }
  27.     int getState() const {
  28.         return state;
  29.     }
  30.     void attach(Observer* observer) override {
  31.         observers.push_back(observer);
  32.     }
  33.     void detach(Observer* observer) override {
  34.         observers.erase(std::remove(observers.begin(), observers.end(), observer), observers.end());
  35.     }
  36.     void notify() override {
  37.         for (Observer* observer : observers) {
  38.             observer->update();
  39.         }
  40.     }
  41. };
  42. // 具体观察者类
  43. class ConcreteObserver : public Observer {
  44. private:
  45.     ConcreteSubject* subject;
  46. public:
  47.     ConcreteObserver(ConcreteSubject* sub) : subject(sub) {
  48.         subject->attach(this);
  49.     }
  50.     void update() override {
  51.         int state = subject->getState();
  52.         std::cout << "Observer notified. New state: " << state << std::endl;
  53.     }
  54. };
  55. int main() {
  56.     ConcreteSubject* subject = new ConcreteSubject();
  57.     ConcreteObserver* observer1 = new ConcreteObserver(subject);
  58.     ConcreteObserver* observer2 = new ConcreteObserver(subject);
  59.     subject->setState(10);
  60.     subject->setState(20);
  61.     delete observer2;
  62.     subject->setState(30);
  63.     delete observer1;
  64.     delete subject;
  65.     return 0;
  66. }
复制代码
在这个示例中,Subject是抽象主题类,ConcreteSubject是详细主题类,Observer是抽象观察者类,ConcreteObserver是详细观察者类。详细主题的状态厘革时会关照全部注册的观察者。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表