集線器的英文稱為“Hub”。“Hub”是“中心”的意思,集線器的主要功能是對接收到的信號進行再生整形放大,以擴大網絡的傳輸距離,同時把所有節點集中在以它為中心的節點上。也就是說是“一個變多個”,如USB HUB,從USB接入后分多個USB接出。對此有一個比較容易理解的應用,那就是日志輸出。
首先定義一個日志輸出接口:
再實現三個類:輸出到日志文件類、輸出到控制台類、輸出到數據庫類。
然后就可以日志輸出了。如:
ILog file = new FileLog();
file.Output("這個信息輸出到日志文件。");
或:
ILog console = new ConsoleLog();
console.Output("這個信息輸出到控制台。");
或:
ILog database = new DatabaseLog();
database.Output("這個信息輸出到數據庫。");
如果此時,日志需要即輸出到控制台,又需要記錄到日志文件。那就得用Hub模式了。
跟節點(這里的節點就是輸出到日志文件類、輸出到控制台類、輸出到數據庫類等實現了ILog的類)一樣實現ILog接口,同時又包含多個節點(輸出)。 結構圖為:
代碼結構圖為:
INode代碼:
public interface INode { void DoSomething(); }
Hub代碼:
public class Hub : INode { private List<INode> _nodes = new List<INode>(); public Hub(params INode[] nodes) { _nodes.AddRange(nodes); } public void DoSomething() { foreach (var item in _nodes) { item.DoSomething(); } } }
此時,我們已經可以寫出Log的Hub類了,實現代碼如下:
public class LogHub : ILog // 實現跟節點一樣的接口ILog { private List<ILog> _logs = new List<ILog>(); //包含多個輸出節點 public LogHub(params ILog[] logs) { _logs.AddRange(logs); } public void Output(string log) {
// 逐個輸出 foreach (var item in _logs) { item.Output(log); } } }
輕松實現多方式輸出,如實現“即輸出到控制台,還需要記錄到日志文件”如下:
ILog loger = new LogHub(new ConsoleLog(), new FileLog());
loger.Output("這個信息即輸出到控制台,還需要記錄到日志文件。");