Patterns. Примеры реализации паттерна Adapter (Адаптер) на Java

Примеры реализации паттерна Adapter (Адаптер) на Java

Данная тема есть продолжением темы:


Содержание





Поиск на других ресурсах:

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

На рисунке 1 и на рисунке 2 изображена структура паттерна Adapter соответственно для класса и объекта. В следующих пунктах реализована реализация этих структур на языке Java.

Паттерн Adapter для класса

Рисунок 1. Паттерн Adapter для класса

Паттерн Адаптер для объекта

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

 

2. Пример реализации паттерна Adapter для класса на языке Java

Данный пример есть демонстрационным и реализует структуру, изображенную на рисунке 1.

// Паттерн Адаптер. Реализация паттерна для класса
// Адаптирует класс Adaptee к интерфейсу Target через промежуточный класс Adapter
// Интерфейс ITarget
interface ITarget {
  void Request();
}

//Класс, метод которого нужно адаптировать к другой системе.
//В данном случае адаптируется имя метода SpecificRequest() в метод Request()
class Adaptee {
  // Некоторый специфический метод
  void SpecificRequest() {
    System.out.println("Adaptee.SpecificRequest()");
  }
}

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

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

public class TestAdapter {
  public static void main(String[] args) {
    // Демонстрация паттерна Adapter для класса.
    // Задача.
    // Нужно адаптировать метод SpecificRequest() класса Adaptee к потребностям экземпляра класса Client.
    // 1. Пусть задан некоторый экземпляр класса Client
    Client client = new Client();

    // 2. Создать экземпляр класса Adapter, который ссылается на интерфейс ITarget
    ITarget target = (ITarget) new Adapter();

    // 3. Передать ссылку target клиентскому методу
    client.ClientMethod(target);
  }
}

Клиент может быть реализован по другому – без использования класса Client. Для этого достаточно объявить ссылку на интерфейс ITarget. Нижеследующий код демонстрирует другой случай использования клиентом интерфейса ITarget.

...

public class TestAdapter {
  public static void main(String[] args) {
    // Демонстрация паттерна Adapter для класса.
    // Задача.
    // Нужно адаптировать метод SpecificRequest() класса Adaptee к потребностям экземпляра client
    // Реализация без использования класса Client
    // 1. Объявить ссылку на интерфейс ITarget
    ITarget client;

    // 2. Создать экземпляр класса Adapter, что ссылается на интерфейс ITarget
    ITarget target = (ITarget) new Adapter();

    // 3. Передать ссылку target клиенту
    client = target;

    // 4. Вызвать метод Request()
    client.Request(); // Adaptee.SpecificRequest()
  }
}

Вышеприведенную реализацию можно еще более упростить.

public class TestAdapter {
  public static void main(String[] args) {
    // 1. Объявить ссылку на интерфейс ITarget и адаптировать его к потребностям клиента
    ITarget client = (ITarget) new Adapter();

    // 2. Вызвать метод Request()
    client.Request(); // Adaptee.SpecificRequest()
  }
}

 

3. Пример реализации паттерна Адаптер для объекта. Решение на языке Java

Данный пример есть демонстрационным и реализует структуру, изображенную на рисунке 2.

// Паттерн Адаптер. Реализация паттерна для объекта
// Интерфейс Target
interface ITarget {
  void Request();
}

//Класс, метод которого нужно адаптировать к другой системе.
//В данном случае адаптируется имя метода SpecificRequest() в метод Request()
class Adaptee {
  // Некоторый специфический метод
  void SpecificRequest() {
    System.out.println("Adaptee.SpecificRequest()");
  }
}

// Класс Adapter - реализует интерфейс ITarget и наследует класс Adaptee
class Adapter implements ITarget {
  // Объявляется ссылка на экземпляр класса Adaptee
  private Adaptee adaptee;

  // Конструктор - получает ссылку на Adaptee
  Adapter(Adaptee adaptee) {
    this.adaptee = adaptee;
  }

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

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

public class TestAdapter {
  public static void main(String[] args) {
    // Демонстрация паттерна Adapter для объекта.
    // Задача.
    // Нужно адаптировать экземпляр класса Adaptee к потребностям экземпляра класса Client.
    // 1. Пусть заданы некоторые экземпляры классов Client и Adaptee
    Client client = new Client();
    Adaptee adaptee = new Adaptee();

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

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

Клиент также может быть реализован в другой способ.

...

public class TestAdapter {
  public static void main(String[] args) {
    // Демонстрация паттерна Adapter для объекта.
    // Задача.
    // Нужно адаптировать экземпляр класса Adaptee к потребностям экземпляра client
    // Другой способ реализации клиента - без использования класса Client
    // 1. Пусть задан экземпляр класса Adaptee, который нужно адаптировать
    Adaptee adaptee = new Adaptee();

    // 2. Объявить ссылку на интерфейс - это есть клиент
    ITarget client;

    // 3. Передать клиенту экземпляр adaptee через посредника - экземпляр класса Adapter
    Adapter adapter = new Adapter(adaptee); // создать экземпляр класса Adapter
    client = (ITarget)adapter;

    // 4. Вызвать метод Request()
    client.Request(); // Adaptee.SpecificRequest()
  }
}

 


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