0

オブザーバー パターンは、イベント駆動型システムで非常に役立ちます。2 つの言語で実装する方法を次に示します。

ジャワ

AOP ライブラリまたはバイトコード エンジニアリング (BCEL、cglib、asm など) を使用して、その場でサブクラスを作成します。監視対象プロパティのゲッターまたはセッターへの呼び出しは、アタッチされたオブザーバーに通知します。

Objective-C

これは Java に似ています - isa swizzling を使用してその場でサブクラスを作成します。監視対象のプロパティを呼び出すと、アタッチされたオブザーバーに通知されます。興味深いことに、Objective-C では、すべてのオブザーバーが削除された場合、ラップされたプロパティ メソッドなしで元のクラスに戻ることができます。一方、Java では通常、クラスは 1 回読み込まれるため、(おそらく空の) 一連のオブザーバーに常に通知します。

C++はどうですか?

C++ ではリフレクションが制限されているため、上記のアプローチを使用することは困難です。C ++での「最良の」(つまり、典型的または事実上の標準を意味する)アプローチは何ですか? 上記で参照した Java および Objective-C の実装のような定型コードを回避する方法はありますか? おそらくC++のメタプログラミング機能を使用していますか?

4

2 に答える 2

3

リフレクションだけを使用して C++ で Observer パターンを実装する方法があるとは思えません。外部ツールを使用しない場合は、すべてを手動で実装する必要があります。たとえば、次のように実装します。

#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 を使用している場合、シグナル/スロットを使用してオブザーバーに変更を通知できます。

于 2013-10-20T04:04:55.113 に答える