2012-02-07 5 views
1

私の現在のデザインでは、それぞれがいくつかのクラスを使用して、それぞれが 周辺デバイスを表しています。各クラスは、出力用のコールバックと同様に、入力のための両方のメソッドと、 のコールバックを提供します。 1つのクラスからの出力は、別のクラスへの入力 として使用されるため、クライアントにすべての コールバックを実装させ、オブジェクト間のすべてのルーティングを処理させるという単純な設計があります。複数のオブジェクト間でデータをルーティングするためのシンプルなデザインですか?

これは、次の簡単な例で示すことができます。私の アプリケーションでは、クラスと入力と出力の数が多くなっています。

interface CentralLockControlCb 
{ 
    void onCentralLockStateChanged(bool on); 
} 

class CentralLockControl 
{ 
    void setDoorLockedIndicator(bool locked); 
} 

interface DoorControlCb 
{ 
    void onDoorLockedStateChanged(bool locked); 
} 

class DoorControl 
{ 
    void setCentralLockState(bool on); 
} 

class Main : public CentralLockControlCb, DoorControlCb 
{ 
    private CentralLockControl centrallock; 
    private DoorControl door; 

    public static void main(String[] args) 
    { 
    clc = new CentralLockControl(this); 
    dc = new DoorControl(this); 
    } 

    void onCentralLockStateChanged(bool on) 
    { 
    door.setCentralLockState(on); 
    } 

    void onDoorLockedStateChanged(bool locked) 
    { 
    centrallock.setDoorLockedIndicator(locked); 
    } 
} 

上記の溶液は、クラスは、お互いについて を知っておく必要がありますが、一方で、彼らは今、非常にメインクラスに結合されたように見えることを避けることができます。

代わりに、私は、各クラスに複数のオブザーバーを許可させ、 を許可し、クラスを互いに観察させることを検討しました。もう1つの選択肢として、 はパブリッシャー/サブスクライバのパターンと似ていますが、それは思われます

どのようなデザインをお勧めしますか?

+3

C++で 'public static void main(String [] args)'とは何ですか? (間違ったタグ?) –

+0

パブリッシャー - 購読者とオブザーバーは同じことです。 –

+0

オブジェクトへのポインタを割り当てることができないため、上記のソリューションは動作しません。これはJavaコードによく似ていますが、やはり有効なJavaではありません。だからまず言語を決めてください。あるいは、もっと一般的なオブジェクト指向の問題だと思われるので、すぐに疑似コードとして宣言してください。この場合、C++タグを削除するだけです。 –

答えて

0

あなたは、その容量で使用されているMainの代わりに使用できるEvent Aggregatorが好きなように聞こえます。 そのルートに入ると、他のデバイスに関する特定のイベントを非常にうまく聞くためにデバイスを登録することができます。さらに、このデザインは、あなたのデバイスが必要なときに特定のイベントを無視できるように、イベントを一般化して有用な状態を運ぶように導く可能性があります。イベントアグリゲーターの複雑さは緩和されます(イベントが発生したときに誰を呼び出す必要があるかについての決定はありません)。 最後に、関係者に非同期で通知することができます。これは、あなたのケースで重要であるかもしれないし、重要であるかもしれません。

関連する問題