观察者模式演示(C++ QT框架)三分钟读懂

观察者模式是一种设计模式,其中一个对象(称为主题或可观察者)维护一组依赖于它的对象(称为观察者),当主题的状态发生变化时,它会通知所有观察者。在C++中结合Qt,可以使用信号和槽机制来实现观察者模式。

直接上代码:

#include <QObject>
#include <QList>

// 定义观察者接口
class Observer : public QObject
{
    Q_OBJECT
public:
    virtual void update() = 0;
};

// 定义可观察者类
class Subject : public QObject
{
    Q_OBJECT
public:
    // 添加观察者
    void addObserver(Observer* observer)
    {
        m_observers.append(observer);
    }

    // 通知观察者,遍历容器,调用每一个观察者的更新函数
    void notify()
    {
        for (Observer* observer : m_observers)
        {
            observer->update();
        }
    }

private:
    // 链表容器,存储观察者对象的指针
    QList<Observer*> m_observers;
};

// 实现观察者类
class ConcreteObserver : public Observer
{
    Q_OBJECT
public:
    // 创建观察者的时候,将被观察者的指针传进来
    ConcreteObserver(Subject* subject) : m_subject(subject)
    {
        // 被观察者将观察者加入到容器中用于后续通知
        m_subject->addObserver(this);
    }

    // 实现更新操作, 当被观察者通知以后,实现相应的操作
    void update() override
    {
        qDebug() << "观察者收到更新信号";
    }

private:
    Subject* m_subject;
};

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    Subject subject;    ///< 被观察者
    ConcreteObserver observer(&subject);    ///< 观察者

    // 模拟主题状态变化,通知观察者
    subject.notify();

    return a.exec();
}

观察者设计模式具有许多优点和一些缺点:

优点:

1. 松耦合(Loose Coupling):观察者模式可以让主题对象(Subject)和观察者对象(Observer)之间保持松散的耦合关系。主题对象并不需要知道观察者的具体细节,只需知道观察者的接口即可。

2. 可扩展性(Scalability):通过观察者模式,可以轻松地添加新的观察者对象,而不需要修改主题对象的代码。这种扩展性使得系统更易于维护和扩展。

3. 通知机制(Notification Mechanism):观察者模式提供了一种通知机制,当主题对象的状态发生变化时,所有注册的观察者对象都会收到通知并相应地更新自己的状态。

4. 多播支持(Multiple Broadcast Support):一个主题对象可以有多个观察者对象,这使得可以同时通知多个观察者对象。

5. 解耦性(Decoupling):观察者模式有助于分离对象之间的关注点,使得各个对象之间的交互更加清晰和简单。

缺点:

1. 内存泄漏风险(Memory Leak Risk):如果观察者对象没有被正确地移除或销毁,可能会导致内存泄漏问题,特别是在长时间运行的系统中。

2. 顺序性问题(Ordering Issues):观察者模式中观察者的通知顺序可能会影响系统的行为,特别是在多个观察者对象之间存在依赖关系时。

3. 性能损耗(Performance Overhead):在观察者模式中,主题对象状态的改变会导致所有观察者对象的更新,这可能会引入一定的性能开销,特别是在观察者对象较多的情况下。

4. 调试困难(Debugging Complexity):由于观察者模式中对象之间的关系较为复杂,可能会增加调试和理解代码的难度。

总的来说,观察者设计模式是一种非常有用的设计模式,特别适合需要实现对象之间一对多的依赖关系的场景。然而,在使用时需要注意管理好对象之间的关系,避免潜在的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值