3

オブザーバーには「void notify(std::string)」関数があり、オブザーバブル オブジェクトは登録されたすべてのオブザーバーでそれを呼び出し、トークン化された文字列を使用してデータを転送する、単純なオブザーバー パターンを作成しました。これは非常にシンプルで簡単で機能しますが、一歩前進する必要があります。

シグナルとスロットを使用して実装する必要があります (たとえば、boost::signals2 を使用)。ただし、スロットと信号がどのように見えるか、どのように配置する必要があるかはわかりません。また、void(文字列)だけでなく、必要な関数を登録できるようにする方法もわかりません。

このパターンにシグナルとスロットを使用する適切なリソースが見つかりませんでした。それでも、シグナルとスロットはオブザーバーパターンにとって素晴らしいと誰もが言います。オブザーバー パターンにシグナルとスロットをどのように使用すればよいか教えていただけますか?

シグナルなしの現在の実装は次のとおりです。

class observable
{
public:
void register(observer *);
void unregister(observer *);
protected:
void notifyObservers()
   {
    for every registered observer
    observer.notify(std::string tokenized_string);
   }
}

class observer
{
public:
void notify(std::string) = 0;
}

シグナルとスロットを使用するようにこのパターンを変更する必要がありますが、便利で適切に設計され、柔軟になる方法がわかりません。

4

1 に答える 1

7

オブザーバー パターンはどのように機能しますか?

  • Observable オブジェクトは Observer オブジェクトによって「監視」されます
  • Observable が変更されると、すべてのオブザーバーに変更が加えられたことを通知します。たとえば、"update" または "notify" 関数 (またはその他) を呼び出すことによってです。

したがって、シグナルスロットに関しては. 基本は、シグナルをスロットに接続することです。スロットは、接続されているシグナルが発信されるたびに呼び出されます。

Observer パターンでの使用は非常に簡単であることがわかります。Observable で信号を作成し、それを更新するために使用される各 Observer のスロットに接続するだけです。

Observable が変更された場合。すべてのオブザーバーのリストをループして、それらのupdateメソッドを次々と呼び出す代わりに、シグナルを送信するだけです。対応するスロットが魔法のように呼び出されます。

さらに進むには、たとえば、Observable にスロットを作成し、Observer が発行する信号に接続して、Observable に変更があった場合に通知する必要があることを伝えることができます...

を使用したことがないため、完全に機能するサンプル コードを取得することはできませんがBoost::signals2How do I use boost::signals to implement the observer pattern? を参照してください。およびC++ での Observer デザイン パターンを使用して作業を進めてください :)

于 2013-02-14T13:06:40.483 に答える