复合记录器

Composite 模式是一种设计模式,允许将一组对象视为对象的单个实例。它是 Gang of Four 的结构设计模式之一。

下面的示例演示了如何使用 Composite 来使用单个 Log 调用来记录到多个位置。这种方法遵循 SOLID 原则, 因为它允许你添加新的日志记录机制而不违反单一责任原则 (每个记录器只有一个责任)或开放/封闭原则 (你可以添加新的记录器,通过添加新的实现和日志记录到新的位置而不是通过修改现有的)。

public interface ILogger
{
    void Log(string message);
}

public class CompositeLogger : ILogger
{
    private readonly ILogger[] _loggers;

    public CompositeLogger(params ILogger[] loggers)
    {
        _loggers = loggers;
    }

    public void Log(string message)
    {
        foreach (var logger in _loggers)
        {
            logger.Log(message);
        }
    }
}

public class ConsoleLogger : ILogger
{
    public void Log(string message)
    {
        //log to console
    }
}

public class FileLogger : ILogger
{
    public void Log(string message)
    {
        //log to file
    }
}

var compositeLogger = new CompositeLogger(new ConsoleLogger(), new FileLogger());
compositeLogger.Log("some message"); //this will be invoked both on ConsoleLogger and FileLogger

值得一提的是,复合记录器可以嵌套(复合记录器构造函数的一个参数可以是另一个复合记录器),创建树状结构。