集线器的英文称为“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("这个信息即输出到控制台,还需要记录到日志文件。");