• C++中的观察者模式


    目录

    观察者模式(Observer Pattern)

    实际应用

    股票价格监控系统

    发布-订阅系统

    总结


    观察者模式(Observer Pattern)

    观察者模式是一种行为型设计模式,它定义了对象间的一对多依赖关系。当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并自动更新。观察者模式主要包含以下角色:
    1. Subject(主题):保存对观察者的引用,并提供注册和注销观察者的方法。
    2. Observer(观察者):定义一个更新接口,用于接收主题的通知。
    3. ConcreteSubject(具体主题):具体实现主题,维护其状态并在状态改变时通知观察者。
    4. ConcreteObserver(具体观察者):具体实现观察者,响应主题的通知并进行相应的更新。

    实际应用

    股票价格监控系统

    -- 实现一个股票价格监控系统,当股票价格发生变化时,所有注册的观察者(例如投资者)都会收到通知。

    1. #include
    2. #include
    3. #include
    4. #include
    5. // 观察者接口
    6. class Observer {
    7. public:
    8. virtual void update(const std::string& stockName, float price) = 0;
    9. };
    10. // 主题接口
    11. class Subject {
    12. public:
    13. virtual void registerObserver(std::shared_ptr observer) = 0;
    14. virtual void removeObserver(std::shared_ptr observer) = 0;
    15. virtual void notifyObservers() = 0;
    16. };
    17. // 具体主题
    18. class Stock : public Subject {
    19. private:
    20. std::string name;
    21. float price;
    22. std::vector> observers;
    23. public:
    24. Stock(const std::string& name, float price) : name(name), price(price) {}
    25. void setPrice(float newPrice) {
    26. price = newPrice;
    27. notifyObservers();
    28. }
    29. float getPrice() const {
    30. return price;
    31. }
    32. void registerObserver(std::shared_ptr observer) override {
    33. observers.push_back(observer);
    34. }
    35. void removeObserver(std::shared_ptr observer) override {
    36. observers.erase(std::remove(observers.begin(), observers.end(), observer), observers.end());
    37. }
    38. void notifyObservers() override {
    39. for (auto& observer : observers) {
    40. observer->update(name, price);
    41. }
    42. }
    43. };
    44. // 具体观察者
    45. class Investor : public Observer {
    46. private:
    47. std::string name;
    48. public:
    49. Investor(const std::string& name) : name(name) {}
    50. void update(const std::string& stockName, float price) override {
    51. std::cout << "Investor " << name << " is notified that " << stockName << " price changed to " << price << std::endl;
    52. }
    53. };
    54. // 客户端代码
    55. int main() {
    56. auto stock = std::make_shared("AAPL", 150.0);
    57. auto investor1 = std::make_shared("Alice");
    58. auto investor2 = std::make_shared("Bob");
    59. stock->registerObserver(investor1);
    60. stock->registerObserver(investor2);
    61. stock->setPrice(155.0);
    62. stock->setPrice(160.0);
    63. stock->removeObserver(investor1);
    64. stock->setPrice(165.0);
    65. return 0;
    66. }

    发布-订阅系统

    -- 实现一个简单的发布-订阅系统,当发布者发布新消息时,所有订阅者都会收到通知。

    1. #include
    2. #include
    3. #include
    4. #include
    5. // 观察者接口
    6. class Subscriber {
    7. public:
    8. virtual void update(const std::string& message) = 0;
    9. };
    10. // 主题接口
    11. class Publisher {
    12. public:
    13. virtual void registerSubscriber(std::shared_ptr subscriber) = 0;
    14. virtual void removeSubscriber(std::shared_ptr subscriber) = 0;
    15. virtual void notifySubscribers() = 0;
    16. };
    17. // 具体主题
    18. class NewsPublisher : public Publisher {
    19. private:
    20. std::string latestNews;
    21. std::vector> subscribers;
    22. public:
    23. void publishNews(const std::string& news) {
    24. latestNews = news;
    25. notifySubscribers();
    26. }
    27. void registerSubscriber(std::shared_ptr subscriber) override {
    28. subscribers.push_back(subscriber);
    29. }
    30. void removeSubscriber(std::shared_ptr subscriber) override {
    31. subscribers.erase(std::remove(subscribers.begin(), subscribers.end(), subscriber), subscribers.end());
    32. }
    33. void notifySubscribers() override {
    34. for (auto& subscriber : subscribers) {
    35. subscriber->update(latestNews);
    36. }
    37. }
    38. };
    39. // 具体观察者
    40. class ConcreteSubscriber : public Subscriber {
    41. private:
    42. std::string name;
    43. public:
    44. ConcreteSubscriber(const std::string& name) : name(name) {}
    45. void update(const std::string& message) override {
    46. std::cout << "Subscriber " << name << " received: " << message << std::endl;
    47. }
    48. };
    49. // 客户端代码
    50. int main() {
    51. auto publisher = std::make_shared();
    52. auto subscriber1 = std::make_shared("Alice");
    53. auto subscriber2 = std::make_shared("Bob");
    54. publisher->registerSubscriber(subscriber1);
    55. publisher->registerSubscriber(subscriber2);
    56. publisher->publishNews("Breaking News: Observer Pattern in Action!");
    57. publisher->publishNews("Latest Update: New Design Patterns Discovered!");
    58. publisher->removeSubscriber(subscriber1);
    59. publisher->publishNews("Exclusive: Observer Pattern Simplified!");
    60. return 0;
    61. }

    总结

    观察者模式帮助我们定义了对象间的一对多依赖关系,使得对象之间的通信变得更加灵活和可扩展。

  • 相关阅读:
    pcba方案开发——蓝牙血氧仪方案设计
    易基因-原核转录组“rRNA捕获探针及其应用“方法获发明专利授权
    Java中的锁和分布式架构中的锁
    《golong入门教程📚》,从零开始入门❤️(建议收藏⭐️)
    基于蜜獾优化的BP神经网络(分类应用) - 附代码
    docker system全新命令集
    单机服务器、集群和分布式
    CSDN竞赛第六期第二题(C++)
    openCV的CUDA GPU 版本安装 (Ubuntu windows 通用)
    如何恢复电脑硬盘删除数据?提供一套实用恢复方案
  • 原文地址:https://blog.csdn.net/GOLOJO/article/details/139619536