Поиск…


Вступление

Структурные шаблоны проектирования - это модели, которые описывают, как объекты и классы могут объединяться и формировать большую структуру, а также упрощают проектирование, определяя простой способ реализации отношений между сущностями. Описаны семь структурных структур. Они следующие: адаптер, мост, композитный, декоратор, фасад, мухи и прокси

Шаблон проектирования адаптера

«Адаптер», как следует из названия, - это объект, который позволяет двум взаимно несовместимым интерфейсам взаимодействовать друг с другом.

Например: если вы покупаете Iphone 8 (или любой другой продукт Apple), вам нужно много адаптеров. Поскольку интерфейс по умолчанию не поддерживает аудио jac или USB. С помощью этих адаптеров вы можете использовать наушники с проводами или использовать обычный кабель Ethernet. Таким образом, «два взаимно несовместимых интерфейса взаимодействуют друг с другом» .

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

Схема адаптера выдает 4 элемента

  1. ITarget: это интерфейс, который клиент использует для достижения функциональности.
  2. Adaptee: Это функциональность, которую клиент хочет, но ее интерфейс несовместим с клиентом.
  3. Клиент. Это класс, который хочет достичь некоторой функциональности, используя код адаптируемого.
  4. Адаптер: это класс, который будет реализовывать ITarget и будет вызывать код Adaptee, который клиент хочет вызвать.

UML

введите описание изображения здесь

Пример первого кода (теоретический пример) .

public interface ITarget
{
    void MethodA();
}

public class Adaptee
{
    public void MethodB()
    {
        Console.WriteLine("MethodB() is called");
    }
}

public class Client
{
    private ITarget target;

    public Client(ITarget target)
    {
        this.target = target;
    }

    public void MakeRequest()
    {
        target.MethodA();
    }
}  

public class Adapter : Adaptee, ITarget
{
    public void MethodA()
    {
        MethodB();
    }
}

Второй пример кода (Real world imlementation)

/// <summary>
///  Interface: This is the interface which is used by the client to achieve functionality.
/// </summary>
public interface ITarget
{
    List<string> GetEmployeeList();
}

/// <summary>
/// Adaptee: This is the functionality which the client desires but its interface is not compatible with the client.
/// </summary>
public class CompanyEmplyees
{
    public string[][] GetEmployees()
    {
        string[][] employees = new string[4][];

        employees[0] = new string[] { "100", "Deepak", "Team Leader" };
        employees[1] = new string[] { "101", "Rohit", "Developer" };
        employees[2] = new string[] { "102", "Gautam", "Developer" };
        employees[3] = new string[] { "103", "Dev", "Tester" };

        return employees;
    }
}

/// <summary>
/// Client: This is the class which wants to achieve some functionality by using the adaptee’s code (list of employees).
/// </summary>
public class ThirdPartyBillingSystem
{
    /* 
     * This class is from a thirt party and you do'n have any control over it. 
     * But it requires a Emplyee list to do its work
     */

    private ITarget employeeSource;

    public ThirdPartyBillingSystem(ITarget employeeSource)
    {
        this.employeeSource = employeeSource;
    }

    public void ShowEmployeeList()
    {
        // call the clietn list in the interface
        List<string> employee = employeeSource.GetEmployeeList();

        Console.WriteLine("######### Employee List ##########");
        foreach (var item in employee)
        {
            Console.Write(item);
        }

    }
}

/// <summary>
/// Adapter: This is the class which would implement ITarget and would call the Adaptee code which the client wants to call.
/// </summary>
public class EmployeeAdapter : CompanyEmplyees, ITarget
{
    public List<string> GetEmployeeList()
    {
        List<string> employeeList = new List<string>();
        string[][] employees = GetEmployees();
        foreach (string[] employee in employees)
        {
            employeeList.Add(employee[0]);
            employeeList.Add(",");
            employeeList.Add(employee[1]);
            employeeList.Add(",");
            employeeList.Add(employee[2]);
            employeeList.Add("\n");
        }

        return employeeList;
    }
}

/// 
/// Demo
/// 
class Programs
{
    static void Main(string[] args)
    {
        ITarget Itarget = new EmployeeAdapter();
        ThirdPartyBillingSystem client = new ThirdPartyBillingSystem(Itarget);
        client.ShowEmployeeList();
        Console.ReadKey();
    }
}

Когда использовать

  • Разрешить системе использовать классы другой системы, которые несовместимы с ней.
  • Разрешить связь между новой и уже существующей системой, которые независимы друг от друга
  • Ado.Net SqlAdapter, OracleAdapter, MySqlAdapter - лучший пример шаблона адаптера.


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow