2017-03-09 54 views
-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呢?

  • A Mediator定義了組件之間的交互,但這裏的對象是不同的類型,並且不知道父類。
  • A Facade封裝了幾個子系統,但是這裏的子系統並不隱藏;它們被注入到構造函數中。

我甚至不確定這是行爲模式還是結構模式。

是否有一個用於定義對象之間流程的類的通用名稱?我可以用作該模式後面類名的後綴,例如Manager,Coordinator,Connector(最好是在.NET框架中已經使用的東西)。或者,因爲我找不到任何東西,我在吠叫錯誤的樹嗎?有沒有更好的方法來實現這種解耦?

+0

有沒有這裏的模式,只是代碼 –

+0

這僅僅是依賴注入 – maccettura

+0

不夠公平 - 我想不是一切都是一個模式!任何關於如何改善這個問題的幫助?我不知道我是否理解了降價。 – 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

至少我有寶石嘗試一個有幫助的答案,在評論部分隱藏投票與隱藏的風險。如果您不同意,請說明原因 - 支持您的答案,以便我們可以進行討論。 –

0

首先,根據你的名字,你似乎有你的聽衆和設備倒退。意思是說,你似乎在聆聽來自聽衆的信號,並將其發送到似乎倒退的設備。在我看來,聽衆意味着聽信號不發送信號。

但除此之外,我認爲你在這裏只是一個消息傳遞系統。不是直接在一起通信,而是有一個消息分派器,它接收來自一個組件的消息並將它們發送給另一個組件。如果您擴展了您擁有的設備而不是單個設備和單個監聽器,則可以建立任意數量的連接。然後,您可以將傳入的消息排隊並根據這些連接將它們分派給偵聽器。

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