2017-03-09 12 views
-2

私はお互いを意識しない2つのインターフェイスを持っています。インターフェイス間のフローを定義するクラスのデザインパターン名

public interface IListener 
{ 
    event SignalEventHandler SignalReceived; 
} 

public interface IDevice 
{ 
    Task HandleSignalAsync(); 
} 

むしろ各リスナーがデバイスを直接呼び出したり、デバイスの実装にリスナーを渡す作るよりも、私は彼らが切り離さ維持し、個別のフローを定義したいと思います。たとえば:

public class MyApplicationFlow 
{ 
    private readonly IListener _listener; 
    private readonly IDevice _device; 

    public MyApplicationFlow(IListener listener, IDevice device) 
    { 
     _listener = listener; 
     _device = device; 

     _listener.SignalReceived += ListenerOnSignalReceived; 
    } 

    private async void ListenerOnSignalReceived(object sender, SignalEventArgs args) 
    { 
     try 
     { 
      await _device.HandleSignalAsync(); 
      // do more stuff in real scenario 

      args.ProgressReporter.ReportComplete(); 
     } 
     catch (Exception ex) 
     { 
      args.ProgressReporter.ReportError(ex); 
     } 
    } 
} 

は、流れの中に渡されたいくつかのIDeviceIListener実装があるかもしれません。

Please excuse the poor diagram!

リスナーおよびデバイスは、アダプタのパターンに従うように見えます。しかし、MyApplicationFlowはどうですか?

  • Mediatorは、コンポーネント間の相互作用を定義しますが、ここではオブジェクトは異なるタイプであり、親クラスを認識しません。
  • Facadeはいくつかのサブシステムをカプセル化しますが、ここではサブシステムは隠されていません。それらはコンストラクタに注入されます。

これが行動パターンであるか構造パターンであるかはわかりません。

オブジェクト間のフローを定義するクラスの共通名はありますか?たとえば、このパターンに続くクラス名の接尾辞として使用できるもの。 ManagerCoordinatorConnector(好ましくは、.NETフレームワークで既に使用されているもの)。

または、私が何かを見つけることができないので、私は間違った木を吠えますか?このデカップリングを実現する良い方法はありますか?

+0

はパターンが単にコード –

+0

これは十分にフェアちょうど依存注入 – maccettura

+0

あり、ここにはありません - 私はないすべてがパターンですね!どのように私はこの質問を改善することができますか?私はdownvotesを理解しているか分からない。 – Connell

答えて

-1

私の最初の考えは、観察者が直接観察していないことを除いて、観察者パターンの変種のように聞こえました。私はEvent/Emitter/Targetと呼ばれるこの変種がかなり近いと感じました。 https://github.com/millermedeiros/js-signals/wiki/Comparison-between-different-Observer-Pattern-implementations

編集 - 私は実際に私の心を変えました。これはpub-subメッセージです。 IDeviceクラスが送信され、中間クラスがメッセージを受信して​​いて、IListenerがサブスクライブしています。

+0

これは、オブザーバーパターンでは何もありません。 – DavidG

+0

私は同意しません。オブザーバー・パターンは、オブジェクトと呼ばれるオブジェクトがオブザーバーと呼ばれる従属オブジェクトのリストを保持し、通常はそれらのメソッドの1つを呼び出すことによって、ステートの変更を自動的に通知するソフトウェア設計パターンです。この場合、聴取者は信号がどのように相互作用するかを定義する仲介を介して信号を受信して​​います。これはまっすぐな観察者とは異なるものですが、これについては観察者であるとは言えません。 –

+1

少なくとも、コメント欄の下に隠れているのとは対照的に、投票の危険を伴う有益な回答を試みる石を持っていました。あなたが同意しない場合は、理由を述べてください - あなたの答えをサポートして、議論をすることができます。 –

0

あなたの名前に基づいて、あなたのリスナーとデバイスを逆向きに持っているようです。意味、あなたは、リスナーから送られた信号を聞いて、それが逆に見えるデバイスに送信しているようです。リスナーは私の意見では信号を送らない信号を聞いていることを暗示しています。

しかし、そうでなければ、あなたがここにいるのは単なるメッセージパッシングシステムだと思います。一緒に直接通信するのではなく、あるコンポーネントからメッセージを受信して​​別のコンポーネントにメッセージを送信するメッセージディスパッチャがあります。 1つのデバイスと1つのリスナーを持つよりも、そこにあるものを拡張する場合は、任意の数の接続を確立できます。次に、着信メッセージをキューに入れ、それらの接続に基づいてリスナーにディスパッチします。

interface IListener { 
    void send(ISender sender, IMessage message); 
} 
interface ISender { } 
interface IMessage { } 
interface IPending { 
    ISender from; 
    IMessage message; 
} 

class Dispatcher { 
    private Queue<IPending> messages = new Queue<IPending>(); 
    private Dictionary<ISender, List<IListener>> connections = new Dictionary<ISender, List<IListener>>(); 

    public void connect(ISender sender, IListener listener) { 
    if (connections[sender] == null) { 
     connections[sender] = new List<IListener>(); 
    } 

    connections[sender].add(listener); 
    } 

    public void remove(ISender sender, IListener listener) { ... } // removes connection from connections 

    public void send(ISender from, IMessage message) { 
    messages.push({ from, message }); 
    } 

    public void next() { // called in a loop, perhaps in a background thread 
    if (messages.peek()) { 
     var message = messages.pop(); 
     foreach(var listener in connections[message.from]) { 
     listener.send(sender, message); 
     } 
    } 
    } 
} 
+0

リスナーは(ある種の)プッシュを待つデバイスは、プッシュが受信されたときにアクションを実行するハードウェアです。実際の実装では、 'EventArgs'に' ProgressReporter'を渡します。混乱を理解するので、これを反映するように質問を更新します! – Connell

関連する問題