![Адаптер](/images/patterns/cards/adapter-mini.png?id=b2ee4f681fb589be5a0685b94692aebb)
Адаптер на C#
Адаптер — это структурный паттерн, который позволяет подружить несовместимые объекты.
Адаптер выступает прослойкой между двумя объектами, превращая вызовы одного в вызовы понятные другому.
Сложность:
Популярность:
Применимость: Паттерн можно часто встретить в C#-коде, особенно там, где требуется конвертация разных типов данных или совместная работа классов с разными интерфейсами.
Признаки применения паттерна: Адаптер получает конвертируемый объект в конструкторе или через параметры своих методов. Методы Адаптера обычно совместимы с интерфейсом одного объекта. Они делегируют вызовы вложенному объекту, превратив перед этим параметры вызова в формат, поддерживаемый вложенным объектом.
Концептуальный пример
Этот пример показывает структуру паттерна Адаптер, а именно — из каких классов он состоит, какие роли эти классы выполняют и как они взаимодействуют друг с другом.
Program.cs: Пример структуры паттерна
using System;
namespace RefactoringGuru.DesignPatterns.Adapter.Conceptual
{
// Целевой класс объявляет интерфейс, с которым может работать клиентский
// код.
public interface ITarget
{
string GetRequest();
}
// Адаптируемый класс содержит некоторое полезное поведение, но его
// интерфейс несовместим с существующим клиентским кодом. Адаптируемый
// класс нуждается в некоторой доработке, прежде чем клиентский код сможет
// его использовать.
class Adaptee
{
public string GetSpecificRequest()
{
return "Specific request.";
}
}
// Адаптер делает интерфейс Адаптируемого класса совместимым с целевым
// интерфейсом.
class Adapter : ITarget
{
private readonly Adaptee _adaptee;
public Adapter(Adaptee adaptee)
{
this._adaptee = adaptee;
}
public string GetRequest()
{
return $"This is '{this._adaptee.GetSpecificRequest()}'";
}
}
class Program
{
static void Main(string[] args)
{
Adaptee adaptee = new Adaptee();
ITarget target = new Adapter(adaptee);
Console.WriteLine("Adaptee interface is incompatible with the client.");
Console.WriteLine("But with adapter client can call it's method.");
Console.WriteLine(target.GetRequest());
}
}
}
Output.txt: Результат выполнения
Adaptee interface is incompatible with the client.
But with adapter client can call it's method.
This is 'Specific request.'