• 设计模式:观察者模式


    观察者模式(Observer Pattern)是一种软件设计模式,属于行为型模式的一种。它定义了一种一对多的依赖关系,让多个观察者对象同时监听一个主题对象,当主题对象发生变化时,会通知所有观察者对象,使它们能够自动更新自己的状态。

    观察者模式的主要角色包括:

    1. 主题(Subject):被观察者,它包含一些重要的状态信息,并可以注册和注销观察者对象。
    2. 观察者(Observer):监听主题对象的状态变化,并在主题对象发生变化时更新自己的状态。
    3. 通知(Notify):主题对象通知观察者对象的方法。

    观察者模式的工作原理如下:

    1. 主题对象向观察者对象注册,将自己作为观察者对象的一个监听器。
    2. 主题对象发生变化时,通过通知方法通知所有观察者对象。
    3. 观察者对象收到通知后,根据主题对象的变化更新自己的状态。

    观察者模式的优点包括:

    1. 降低了主题对象和观察者对象之间的耦合度,主题对象只需要维护一个观察者列表,不需要关心具体的观察者对象。
    2. 支持动态添加和删除观察者对象,主题对象可以随时注册和注销观察者对象。
    3. 可以实现广播机制,主题对象可以同时通知多个观察者对象。
    4. 可以实现数据的共享和同步,主题对象的状态变化可以及时地反映在观察者对象中。

    观察者模式的缺点包括:

    1. 如果主题对象需要维护大量的观察者对象,可能会导致性能问题。
    2. 如果主题对象的通知方法频繁调用,可能会导致观察者对象的频繁更新,也可能会导致性能问题。
    3. 如果主题对象和观察者对象之间存在复杂的依赖关系,可能会导致难以维护和调试。

    总之,观察者模式是一种简单而实用的设计模式,它可以帮助降低对象之间的耦合度,实现数据的共享和同步,同时也需要注意其可能带来的性能问题。在实际应用中,需要根据具体情况选择合适的设计模式,以满足不同的需求。

    以下是一个简单的 C++版本的观察者模式示例代码:

    #include 
    #include 
    
    using namespace std;
    
    // 主题类
    class Subject {
    public:
        virtual void attach(Observer* obs) {
            observers_.push_back(obs);
        }
    
        virtual void detach(Observer* obs) {
            observers_.erase(find(observers_.begin(), observers_.end(), obs));
        }
    
        virtual void notify() {
            for (Observer* obs : observers_) {
                obs->update();
            }
        }
    
    private:
        vector<Observer*> observers_;
    };
    
    // 观察者类
    class Observer {
    public:
        virtual void update() = 0;
    };
    
    // 具体的观察者类 1
    class Observer1 : public Observer {
    public:
        void update() override {
            cout << "Observer1 got notified." << endl;
        }
    };
    
    // 具体的观察者类 2
    class Observer2 : public Observer {
    public:
        void update() override {
            cout << "Observer2 got notified." << endl;
        }
    };
    
    int main() {
        Subject sub;
        Observer1 obs1;
        Observer2 obs2;
    
        sub.attach(&obs1);
        sub.attach(&obs2);
    
        sub.notify(); // 主题发生变化,通知所有观察者
    
        sub.detach(&obs1);
        sub.notify(); // 主题发生变化,通知剩余的观察者
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63

    在上述示例中,Subject类是主题类,它维护了一个观察者列表observers_,可以注册和注销观察者对象。Observer类是观察者类,它是一个抽象类,需要子类实现update方法来处理主题对象的变化。Observer1Observer2是具体的观察者类,它们分别实现了update方法来处理主题对象的变化。

    在示例中,我们创建了一个主题对象sub和两个观察者对象obs1obs2,并注册了这两个观察者对象到主题对象中。然后,主题对象发生了一个变化,并通知了所有观察者对象。观察者对象收到通知后,调用update方法根据主题对象的变化更新自己的状态。

    最后,我们注销了obs1观察者对象,并再次通知主题对象发生变化。由于obs1已经被注销,所以它不会收到通知,只有obs2会收到通知并更新自己的状态。

    这只是一个简单的示例,实际应用中,主题对象和观察者对象可能会更加复杂,并且可能需要处理多个事件和多个观察者对象。同时,也需要注意处理主题对象和观察者对象之间的耦合度,以避免引入不必要的复杂性。

  • 相关阅读:
    前端性能优化方法与实战03 案例分析:移动端 M 站性能优化落地注意事项
    MapReduce程序设计2
    Java属性序列化自定义排序与字母表排序
    Java-Jackson使用详解
    如何使用按图搜索(拍立淘)获取商品数据
    【数据结构初阶-oj题】栈和队列的oj题(入门)
    基于单片机声光控智能路灯系统仿真设计
    ThrowableError in Arr.php line 380
    图解快速排序——通俗易懂(quick sort)
    springBoot整合讯飞星火认知大模型
  • 原文地址:https://blog.csdn.net/qq_45152711/article/details/134397657