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()
  }
}

 


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