放大器(或集线器)模式(Hub)

时间:2024-02-21 20:26:56

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