🎉 Ура! После трёх лет работы, я наконец выпустил английскую версию книги о паттернах! Вот она »

C#: Адаптер

Adapter Адаптер Adapter

Адаптер — это структурный паттерн, который позволяет подружить несовместимые объекты.

Адаптер выступает прослойкой между двумя объектами, превращая вызовы одного в вызовы понятные другому.

Подробней об Адаптере

Особенности паттерна на C#

Сложность:

Популярность:

Применимость: Паттерн можно часто встретить в C#-коде, особенно там, где требуется конвертация разных типов данных или совместная работа классов с разными интерфейсами.

Признаки применения паттерна: Адаптер получает конвертируемый объект в конструкторе или через параметры своих методов. Методы Адаптера обычно совместимы с интерфейсом одного объекта. Они делегируют вызовы вложенному объекту, превратив перед этим параметры вызова в формат, поддерживаемый вложенным объектом.

Пример: Структура паттерна

Этот пример показывает структуру паттерна Адаптер, а именно — из каких классов он состоит, какие роли эти классы выполняют и как они взаимодействуют друг с другом.

Program.cs: Пример структуры паттерна

using System;

namespace RefactoringGuru.DesignPatterns.Adapter.Structural
{
    // / <summary>
 / EN: Adapter Design Pattern
 /
 / Converts the interface of
    // a class into the interface clients expect.
 / Adapter lets classes work
    // together where they otherwise couldn't, due to incompatible interfaces.
    // / 
 / RU: Паттерн Адаптер
 / 
 / Преобразует интерфейс одного класса к
    // интерфейсу другого класса.
 / Адаптер позволяет классам работать друг с
    // другом, даже если их интерфейсы несовместимы.
 / </summary>


    // / <summary>
 / EN: ITarget defines interface expected by the client.
 /
    // / RU: ITarget определяет интерфейс, с которым может работать клиент.
 /
    // </summary>
    interface ITarget
    {
        string GetRequest();
    }

    // / <summary>
 / EN: The Adaptee contains some useful behavior, but its
    // interface is incompatible
 / with the existing client code.The Adaptee
    // needs some adaptation before the client code can use it.
 / 
 / RU: Класс
    // Adaptee содержит полезные методы, но его интерфейс несовместим с тем,
    // который
 / ожидается клиентом. Интерфейс Adaptee требует некоторой
    // адаптации для того,
 / чтобы клиент мог его использовать.
 / </summary>
    class Adaptee
    {
        public string GetSpecificRequest()
        {
            return "Specific request.";
        }
    }

    // / <summary>
 / EN: The Adapter makes the Adaptee's interface compatible
    // with the ITarget interface. 
 / 
 / RU: Адаптер позволяет привести
    // интерфейс Adaptee к ожидаемому клиентом интерфейсу ITarget.
 / </summary>
    class Adapter : ITarget
    {
        private readonly Adaptee _adaptee;

        public Adapter(Adaptee adaptee)
        {
            _adaptee = adaptee;
        }

        public string GetRequest()
        {
            return $"This is '{_adaptee.GetSpecificRequest()}'";
        }
    }

    class Client
    {
        public void Main()
        {
            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());
        }
    }

    class Program
    {
        static void Main()
        {
            new Client().Main();
        }
    }
}

Output.txt: Результат выполнения

Adaptee interface is incompatible with the client.
But with adapter client can call it's method.
This is 'Specific request.'