Примеры реализации паттерна 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#. Лабораторная работа. Адаптация трех методов
⇑