Приклади реалізації паттерну Adapter (Адаптер) на Java
Дана тема є продовженням теми:
Зміст
- 1. Структура паттерну Adapter
- 2. Приклад реалізації паттерну Adapter для класу на мові Java
- 3. Приклад реалізації паттерну Адаптер для об’єкту. Розв’язок на мові Java
- Зв’язані теми
Пошук на інших ресурсах:
1. Структура паттерну Adapter
На рисунку 1 та на рисунку 2 зображено структуру паттерну Adapter відповідно для класу та об’єкту. У наступних пунктах реалізовано реалізацію цих структур на мові Java.
Рисунок 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() } }
⇑
Зв’язані теми
- Огляд та дослідження. Приклади реалізації на C++
- Приклади реалізації паттерну Adapter на C#
- Розв’язок задачі з використанням паттерну Adapter на Java та C#. Лабораторна робота. Адаптація трьох методів
⇑