设计模式之观察者模式

观察者模式(Observer Pattern)是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。这种模式通常被用于实现对象之间的松耦合。

观察者模式的角色:

  1. Subject(主题):被观察的对象,它维护一组观察者,提供添加、删除和通知观察者的方法。

  2. Observer(观察者):观察主题的对象,当主题状态发生变化时会接收到通知并进行相应的更新操作。

    #include <iostream>
    #include <vector>
    
    // Observer(观察者)基类
    class Observer {
    public:
        virtual void update() = 0;
    };
    
    // Subject(主题)基类
    class Subject {
    public:
        void attach(Observer* observer) {
            observers.push_back(observer);
        }
    
        void detach(Observer* observer) {
            // Implement detach logic here
        }
    
        void notify() {
            for (Observer* observer : observers) {
                observer->update();
            }
        }
    
    private:
        std::vector<Observer*> observers;
    };
    
    // 具体观察者类
    class ConcreteObserver : public Observer {
    public:
        ConcreteObserver(std::string name) : name(name) {}
    
        void update() override {
            std::cout << "Observer " << name << " received update." << std::endl;
        }
    
    private:
        std::string name;
    };
    
    // 具体主题类
    class ConcreteSubject : public Subject {
    public:
        void changeState() {
            // Do something that changes the state
            notify(); // 通知观察者
        }
    };
    
    int main() {
        ConcreteSubject subject;
    
        ConcreteObserver observer1("Observer1");
        ConcreteObserver observer2("Observer2");
    
        subject.attach(&observer1);
        subject.attach(&observer2);
    
        subject.changeState();
    
        return 0;
    }

    在这个示例中,Observer 是观察者的抽象基类,Subject 是主题的抽象基类。ConcreteObserver 和 ConcreteSubject 分别是具体的观察者和主题类。

    当 ConcreteSubject 的状态发生变化时,它会调用 notify() 方法通知所有注册的观寰者,观察者会调用自己的 update() 方法来响应主题的变化。

    观察者模式有助于实现对象之间的解耦,当主题对象的状态发生变化时,所有观察者对象都会自动更新,而无需主题对象直接调用观察者对象的方法。

使用场景:

  1. GUI界面中的事件处理

    • 在图形用户界面(GUI)开发中,观察者模式常用于处理用户界面组件的事件,比如按钮点击、文本框输入等。当用户与界面交互时,各个组件(观察者)可以注册到事件源(主题)上,以便接收并响应事件的通知。
  2. 消息通知系统

    • 消息通知系统中,发布者(主题)发布消息,订阅者(观察者)接收并处理消息。观察者模式可以帮助实现消息的订阅和发布机制。
  3. 股票市场监控系统

    • 在股票市场监控系统中,投资者(观察者)可以订阅感兴趣的股票(主题),当股票价格发生变化时,系统会通知所有订阅者。
  4. 游戏开发中的事件处理

    • 在游戏开发中,观察者模式常被用于处理游戏内事件,比如角色状态变化、道具获取等。游戏中的各个系统可以作为观察者,而事件的发生则由游戏世界(主题)来触发。
  5. 网络应用中的状态更新

    • 在网络应用中,观察者模式可以用于实现状态更新的自动通知。例如,在一个在线聊天应用中,用户状态的变化可以通知所有好友。
  6. 数据监控系统

    • 在数据监控系统中,观察者模式可用于实时监测数据变化。当数据源(主题)的数据发生变化时,所有相关的数据监控器(观察者)可以及时更新。
  7. 发布-订阅系统

    • 观察者模式也可以用于实现发布-订阅模式,其中发布者(主题)负责发布消息,订阅者(观察者)可以选择订阅感兴趣的消息类型。

在这些场景下,观察者模式可以帮助实现对象之间的松耦合,提高代码的可维护性和扩展性,同时支持动态的一对多关系,使系统更加灵活和可扩展。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值