using System; using System.IO; namespace Logging { class Program { static void Main(string[] args) { Console.WriteLine("--- Pathfinder в файл ---"); ILogger fileLogger = new FileLogWritter("pathfinder_general.log"); var pathfinderToFile = new Pathfinder(fileLogger); pathfinderToFile.Find("Древний свиток"); Console.WriteLine("\n------------------\n"); Console.WriteLine("--- Pathfinder в консоль ---"); ILogger consoleLogger = new ConsoleLogWritter(); var pathfinderToConsole = new Pathfinder(consoleLogger); pathfinderToConsole.Find("Скрытое сокровище"); Console.WriteLine("\n------------------\n"); Console.WriteLine("--- Pathfinder в файл по пятницам ---"); ILogger secureFileLogger = new SecureFileLogWritter("pathfinder_friday.log"); var pathfinderToFileOnFriday = new Pathfinder(secureFileLogger); pathfinderToFileOnFriday.Find("Часть потерянной карты"); Console.WriteLine("\n------------------\n"); Console.WriteLine("--- Pathfinder в консоль по пятницам ---"); ILogger secureConsoleLogger = new SecureConsoleLogWritter(); var pathfinderToConsoleOnFriday = new Pathfinder(secureConsoleLogger); pathfinderToConsoleOnFriday.Find("Секретный артефакт"); Console.WriteLine("\n------------------\n"); Console.WriteLine("--- Pathfinder в консоль И в файл по пятницам ---"); ILogger consoleAndFileLoggerOnFriday = new ConsoleAndFileLoggerOnFriday("pathfinder_friday_and_console.log"); var pathfinderToConsoleAndFileOnFriday = new Pathfinder(consoleAndFileLoggerOnFriday); pathfinderToConsoleAndFileOnFriday.Find("Легендарный меч"); Console.WriteLine("\n--- Конец симуляции. Нажмите любую клавишу для выхода. ---"); Console.ReadKey(); } } public interface ILogger { void WriteError(string message); } public class ConsoleLogWritter : ILogger { public virtual void WriteError(string message) { Console.WriteLine(message); } } public class FileLogWritter : ILogger { private readonly string _filePath; public FileLogWritter(string filePath = "log.txt") { _filePath = filePath; } public virtual void WriteError(string message) { File.AppendAllText(_filePath, $"{DateTime.Now}: {message}{Environment.NewLine}"); } } public class SecureConsoleLogWritter : ConsoleLogWritter { public override void WriteError(string message) { if (DateTime.Now.DayOfWeek == DayOfWeek.Friday) { base.WriteError(message); } } } public class SecureFileLogWritter : FileLogWritter { public SecureFileLogWritter(string filePath = "friday_log.txt") : base(filePath) { } public override void WriteError(string message) { if (DateTime.Now.DayOfWeek == DayOfWeek.Friday) { base.WriteError(message); } } } public class Pathfinder { private readonly ILogger _logger; public Pathfinder(ILogger logger) { _logger = logger ?? throw new ArgumentNullException("Логгер не может быть null."); } public void Find(string itemToFind) { Console.WriteLine($"Pathfinder осуществляет поиск: {itemToFind}"); _logger.WriteError($"Предмет '{itemToFind}' был найден."); } } public class CombinedLogger : ILogger { private readonly ILogger[] _loggers; public CombinedLogger(params ILogger[] loggers) { _loggers = loggers ?? throw new ArgumentNullException("Список логгеров не может быть null."); } public void WriteError(string message) { foreach (var logger in _loggers) { logger.WriteError(message); } } } public class ConsoleAndFileLoggerOnFriday : ILogger { private readonly ILogger _console; private readonly ILogger _file; public ConsoleAndFileLoggerOnFriday(string filePath = "combined_friday.log") { _console = new ConsoleLogWritter(); _file = new FileLogWritter(filePath); } public void WriteError(string message) { _console.WriteError(message); if (DateTime.Now.DayOfWeek == DayOfWeek.Friday) { _file.WriteError(message); } } } }