Adapter.cs
Код подключён напрямую из исходного файла в кодировке UTF-8, поэтому эта страница всегда показывает его актуальную версию.
← К конспекту
Скачать исходный файл
| Adapter.cs |
|---|
| using System;
namespace DesignPatterns.Structural.Adapter
{
// Интерфейс, который ожидает наш код (Target)
public interface IJsonLogger
{
void LogAsJson(string json);
}
// Существующий сторонний класс с несовместимым интерфейсом (Adaptee).
// Представим, что это код из NuGet-пакета, который мы не можем менять.
public sealed class LegacyXmlLogger
{
public void WriteXml(string xml) => Console.WriteLine($"[XML LOG] {xml}");
}
// Adapter преобразует вызов IJsonLogger.LogAsJson в вызов LegacyXmlLogger.WriteXml,
// конвертируя формат данных внутри.
public sealed class XmlLoggerAdapter : IJsonLogger
{
private readonly LegacyXmlLogger _legacyLogger;
public XmlLoggerAdapter(LegacyXmlLogger legacyLogger)
{
_legacyLogger = legacyLogger;
}
public void LogAsJson(string json)
{
string xml = ConvertJsonToXml(json);
_legacyLogger.WriteXml(xml);
}
// Упрощённая "конвертация" для примера
private static string ConvertJsonToXml(string json) =>
$"<log>{json}</log>";
}
public static class Demo
{
// Клиентский код работает только с IJsonLogger и ничего не знает
// о существовании LegacyXmlLogger.
private static void Report(IJsonLogger logger, string json) => logger.LogAsJson(json);
public static void Run()
{
IJsonLogger logger = new XmlLoggerAdapter(new LegacyXmlLogger());
Report(logger, "{\"event\":\"OrderCreated\"}");
}
}
}
|