Patterns. Примеры реализации паттерна Adapter на C#

Примеры реализации паттерна Adapter на C#

Перед изучением данной темы рекомендуется ознакомиться со следующей темой:


Содержание


Search other websites:




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

Паттерн Adapter имеет две разновидности, которые отличаются реализацией и полученными результатами:

  • адаптер для класса (рисунок 1). В этом случае используется механизм наследования;
  • адаптер для объекта (рисунок 2). В этом случае используется композиция объектов.

 

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

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

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

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

 

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

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

// Паттерн Адаптер для класса. Решение на языке C#
using System;
using static System.Console;

namespace ConsoleApp10
{
  // Адаптирует класс Adaptee к интерфейсу ITarget через промежуточный класс 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);
    }
  }
}

 


Связанные темы