Patterns. Приклади реалізації паттерну Adapter на C#

Приклади реалізації паттерну Adapter на C#

Перед розглядом даної теми рекомендується ознайомитись з наступною темою:


Зміст


Пошук на інших ресурсах:




1. Структура паттерну Adapter

Паттерн Adapter має два різновиди, які відрізняються реалізацією та отриманими результатами:

  • адаптер для класу (рисунок 1). У цьому випадку використовується механізм успадкування;
  • адаптер для об’єкту (рисунок 2). У цьому випадку використовується композиція об’єктів.

Адаптер для класу. Структурна схема

Рисунок 1. Адаптер для класу. Структурна схема

Адаптер для об’єкту. Структурна схема

Рисунок 2. Адаптер для об’єкту. Структурна схема

 

2. Адаптер для класу

Нижче наведено реалізацію паттерну Адаптер для класу, яка містить такі самі імена як зображено на рисунку 1.

// Паттерн Адаптер для класу. Розв'язок на мові C#
using System;
using static System.Console;

namespace ConsoleApp10
{
  // Адаптує клас Adaptee до інтерфейсу Target через проміжний клас Adapter
  // Інтерфейс ITarget
  interface ITarget
  {
    public void Request();
  }

  //Клас, метод якого потрібно адаптувати до іншої системи.
  //У даному випадку адаптується ім'я методу SpecificRequest() в метод Request()
  class Adaptee
  {
    // Деякий специфічний метод
    public void SpecificRequest()
    {
      WriteLine("Adaptee.SpecificRequest()");
    }
  }

  // Клас Adapter - реалізує інтерфейс ITarget та успадковує клас Adaptee
  class Adapter : Adaptee, ITarget
  {
    // Реалізація методу Request() інтерфейсу ITarget
    public void Request()
    {
      // Всередині методу викликається метод SpecificRequest() класу Adaptee()
      SpecificRequest();
    }
  }

  // Клас Client - отримує посилання на інтерфейс ITarget
  class Client
  {
    // деякий метод класу Client
    public void ClientMethod(ITarget target)
    {
      target.Request();
    }
  }

  class Program
  {
    static void Main(string[] args)
    {
      // Демонстрація паттерну Adapter для класу.
      // Завдання.
      // Потрібно адаптувати екземпляр класу Adaptee до потреб екземпляру класу Client.
      // 1. Створити екземпляр класу Client
      Client client = new Client();

      // 2. Створити екземпляр класу Adapter, що посилається на інтерфейс ITarget
      ITarget target = new Adapter();

      // 3. Передати клієнту target
      client.ClientMethod(target);
    }
  }
}

 

3. Адаптер для об’єкту

Нижченаведений код демонструє реалізацію паттерну Адаптер для об’єкту з рисунку 2.

// Паттерн Адаптер для об'єкту. Розв'язок на мові C#
using System;
using static System.Console;

namespace ConsoleApp10
{
  // Адаптує клас Adaptee до інтерфейсу Target через проміжний клас Adapter
  // Інтерфейс ITarget
  interface ITarget
  {
    public void Request();
  }

  // Клас, метод якого потрібно адаптувати до іншої системи.
  // У даному випадку адаптується ім'я методу SpecificRequest() в метод Request()
  class Adaptee
  {
    // Деякий специфічний метод
    public void SpecificRequest()
    {
      WriteLine("Adaptee.SpecificRequest()");
    }
  }

  // Клас Adapter - реалізує інтерфейс ITarget
  class Adapter : ITarget
  {
    private Adaptee adaptee; // посилання на Adaptee

    // Конструктор
    public Adapter(Adaptee adaptee)
    {
      // ініціалізувати внутрішнє посилання adaptee параметром
      this.adaptee = adaptee;
    }

    // Реалізація методу Request() інтерфейсу ITarget
    public void Request()
    {
      // Всередині методу викликається метод SpecificRequest() класу Adaptee()
      adaptee.SpecificRequest();
    }
  }

  // Клас Client - отримує посилання на інтерфейс ITarget
  class Client
  {
    // деякий метод класу Client
    public void ClientMethod(ITarget target)
    {
      target.Request();
    }
  }

  class Program
  {
    static void Main(string[] args)
    {
      // Демонстрація паттерну Adapter для об’єкту.
      // Завдання.
      // Потрібно адаптувати екземпляр класу Adaptee до потреб екземпляру класу Client.
      // 1. Нехай задано деякі екземпляри класів Client та Adaptee
      Client client = new Client();
      Adaptee adaptee = new Adaptee();

      // 2. Створити екземпляр класу Adapter, передати екземпляр класу Adaptee
      //    в конструктор класу Adapter
      ITarget target = new Adapter(adaptee);

      // 3. Передати клієнту target
      client.ClientMethod(target);
    }
  }
}

 


Зв’язані теми