java - 在 C++ 中实现观察者模式

标签 java c++ objective-c design-patterns observer-pattern

观察者模式在事件驱动系统中非常有用。以下是如何用两种语言实现它:

Java

使用 AOP 库或字节码工程(BCEL、cglib、asm 等)即时创建子类。对被观察属性的 getter 或 setter 的任何调用都会通知任何附加的观察者。

Objective-C

这类似于 Java - 使用 isa swizzling 动态创建子类。对观察到的属性的任何调用都会通知附加的观察者。有趣的是,在 Objective-C 中,如果所有观察者都被移除,我们可以在没有包装属性方法的情况下调配回原始类。而在 Java 中,一个类通常只加载一次,因此您总是要通知一组(可能为空的)观察者。

C++怎么样?

由于 C++ 中的反射有限,因此很难使用上述方法。 C++ 中的“最佳”(我指的是典型的或事实上的标准)方法是什么?有什么方法可以避免像我上面提到的 Java 和 Objective-C 实现中那样的样板代码?也许使用 C++ 元编程功能?

最佳答案

我不相信有一种方法可以仅使用反射在 C++ 中实现观察者模式。如果您不使用任何外部工具,则必须手动实现所有内容。例如,我会像这样实现它:

#include <iostream>
#include <set>
using namespace std;

class Impl;

class ObserverBase {
public:
    virtual void propertyChanged(Impl *impl, int value) = 0;
};

class Impl {
public:
    void setProperty(int value) {
        if (m_property != value) {
            m_property = value;
            for(auto observer:m_observers) {
                observer->propertyChanged(this, value);
            }
        }
    }
    int getProperty() {
        return m_property;
    }

    void addObserver(ObserverBase *observer) {
        m_observers.insert(observer);
    }
private:
    int m_property;
    set<ObserverBase *> m_observers;
};

class Observer : public ObserverBase {
public:
    virtual void propertyChanged(Impl *impl, int value) {
        cout << "Saw new value of " << value << "!" << endl;
    }
};

int main() {
    Impl impl;
    impl.addObserver(new Observer());
    impl.setProperty(5);
}

如果您希望自动生成 ObserverBase 和 Impl 中的 for 循环,您可以在编译时解析 C++。我不知道有什么可以为您做到这一点。

如果您使用的是第三方库,它们可能包含可提供帮助的工具。例如,如果您使用的是 Qt,则可以使用信号/槽来通知观察者更改。

关于java - 在 C++ 中实现观察者模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19473437/

相关文章:

c++ - QDateTime 与 sqlite3

ios - 为 Storyboard 中的导航栏分配色调颜色会分配错误的颜色

objective-c - 如何在 Objective-C 中调试单例

objective-c - 使用 Cocoa/objective-C 的 HTTPS 请求

java - java中的接口(interface)是否继承自Object类

java - 为 bean 添加属性

java - 在 SPOJ 中针对此代码收到 NZEC 错误

java - Apache common-email lib - TLS 显示警告

c++ - 访问类中的结构成员,LinkedList Node

c++ - C++ 指针指向数组 : invalid type argument of unary * (have 'int), 的错误需要左值作为赋值的左操作数