2011-01-19 9 views
3

に情報を渡し、あらゆるnewbienessを言い訳してください)、Observerパターン - オブザーバー

私は実行するには、次のタスクがあります。

を私は常にから情報を収集し、いくつかのクラス(これらAを呼び出す)を持っていますさまざまな情報源(データベース、インターネットなど)。彼らはいくつかの話題の潜在的に大量の情報を含めることができます..

十分な情報が提供されている場合、私は様々なグラフをレンダリングすることができるクラスの束(これらのBと呼ぶ)があります。 1つ以上の浮動小数点値など)。

ここでは、これらの2つの要素を結びつけることで、最小限の変更でどの情報がどのフォームに表示されるかを変更することができます。今、私はこの問題にうまく対応しているように見えるので、ここでオブザーバパターンを使うことを検討しています。しかし、私はちょっと立ち往生してアドバイスをしたいです。私は明らかに、 "データソース"ベースタイプのクラスAを作ることができます。これは、加入者を許可し、変更があったときに加入者に通知します。私は、「オブザーバー」タイプのクラスBを作成し、データソースに登録して変更を通知することもできます。

問題は、視聴者が表示している特定の種類の情報を知りたくないということです。たとえば、都市の温度をY軸上でグラフ化し、X軸上で時間をグラフ化したい場合、2D-plotクラス(B型)がある場合は、A->GetTemperature()の呼び出しを避けたいと考えています。同様に、クラスAに、私はNotifyOfTemperatureChange()またはそのような何かを呼び出すにしたくない...

ひとつのアイデアは"temperature""time""humidity"、などのように列挙型または文字列の束を定義し、どのような観測者に伝えることですそれは聞くべきです(A->SetYAxis (B, "temperature")のようなものです - ここでは、クラスAに、データソースBからのY軸の単一の浮動小数点値、チャネル "温度"を取得する必要があります)

B->subscribeTo (whateverIPassedIn)。そうすれば、Bはどんな情報をプロットしているのかを知る必要はありません。 AはnotifyOfChangesOnThisChannel ("temperature")と表示されます。しかし、これは私にとってちょっとハッキリしているようです...例えば、データは実際に通知された関数に渡されますか?私はこのような何かしなければならないでしょう:

void B::subscriberChanged (int subscriberId, std::string channel) 
{ 
    float value = datasource [subscriberId].GetCurrentValue (channel); 
} 

のか、どのようにデータの種類を知っているBだろう、それは

void B::subscriberChanged (int subscriberId, std::string channel, void *data) 
{ 
    float value = *static_cast <float *> (data); 
} 

しかもようなものでしょうか?この例では浮動小数点数ですが、intまたはdoubleの場合はどうなりますか?

私の質問は次のとおりです。これは正しいですか?この問題にアプローチするには、より良い方法がありますか?

はあなたのオブザーバーテンプレートクラスを作ることによって、この問題を解決することができ、事前

+1

こんにちは!新生児は許されない。次回は、コードサンプルを4つのスペースでインデントして、正しくフォーマットしてください。 –

+0

となります。ありがとうございました。 – vmpstr

答えて

3

でいただきありがとうございます。次に、あなたが呼ぶことができる、例えば、Factという最小限のインターフェース(または実際にはコンセプト)を定義しなければなりません。これは、単一のデータ項目がどのように見えるかを定義します。軸の記述方法(ラベル、単位、線形/対数など)を定義する概念AxisDescriptionを定義することもできます。

ここで説明する簡単な例:

template<class FactType, class AxisType> 
class B { 
public: 
    b(AxisType axis); // initialization requires a description of the axis 

    // called when a new fact is available 
    void notify(FactType fact); 

    // called when many fact should be reported 
    template<class FactIterator> 
    void notify(FactIterator begin, FactIterator end); 
}; 

FactTypeは、あなたがそれで何をしたいかに応じて、floatまたはintのような単純なだけでなく、より複雑になることがあります。

+0

うーん..それは私が考慮しなかったもののように見えますが、それは良いことです。 :)そのようなものは物事を単純化します。私はFactTypeをインターフェイスにすることでそれを少し修正して、fact、type、およびその値のソースのようなものを得ることができると思います。そうすれば、私はそれを表示すべき場所に合わせることができます。ありがとうございました! – vmpstr

関連する問題