集線器的英文稱為“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("這個信息即輸出到控制台,還需要記錄到日志文件。");
