Решение задачи с использованием паттерна Адаптер на Java и C#. Лабораторная работа. Адаптация трех методов
Перед использованием данной темы рекомендуется ознакомиться со следующей темой:
Содержание
- Условие задачи
- Решение
- Связанные темы
Поиск на других ресурсах:
Условие задачи
Используя средства языка программирование Java решить следующую задачу.
Пусть задан класс с именем Original, в котором есть 3 метода с именами OriginalDouble(), OriginalInt(), OriginalChar(). Каждый из методов получает по одному параметру:
- метод OriginalDouble() получает значение типа double и выводит его на экран;
- метод OriginalInt() получает значение типа int и выводит его на экран;
- метод OriginalChar() получает значение типа char и выводит его на экран.
Нужно адаптировать класс Original к потребностям класса Client, который имеет следующие требования:
- метод OriginalDouble() нужно переименовать в ClientDouble(). Работа метода остается неизменной;
- метод OriginalInt() нужно заменить методом ClientInt(). Метод ClientInt() должен выводить двойное значение (умноженное на 2) параметру типа int;
- метод OriginalChar() нужно заменить методом ClientChar(). Метод ClientChar() выводит параметр типа char 5 раз.
Класс Client должен получать ссылку на интерфейс ITarget в конструкторе.
⇑
Решение
1. Решение с использованием паттерна Adapter для класса
1.1. Структурная схема, которая отображает решение задачи
На рисунке 1 изображена структурная схема, отображающая решение данной задачи с помощью паттерна Adapter для класса.
Рисунок 1. Решение задачи. Паттерн Adapter для класса
⇑
1.2. Текст программы с решением на языке Java
// Решение задачи. Использование паттерна Adapter для класса. // Исходный класс Original, содержащий 3 метода: // OriginalDouble(), OriginalInt(), OriginalChar() class Original { void OriginalDouble(double value) { System.out.println("Method Original.OriginalDouble(), value = " + value); } void OriginalInt(int value) { System.out.println("Method Original.OriginalInt(), value = " + value); } void OriginalChar(char value) { System.out.println("Method Original.OriginalChar(), value = " + value); } } // Объявить интерфейс ITarget, содержащий названия методов, // которые нужны клиенту interface ITarget { void ClientDouble(double value); void ClientInt(int value); void ClientChar(char value); } // Объявить класс Adapter, который наследует класс Original // и реализует интерфейс ITarget class Adapter extends Original implements ITarget { // Нужно обязательно реализовать 3 метода интерфейса Original public void ClientDouble(double value) { // здесь вызвать метод OriginalDouble() - замена имени this.OriginalDouble(value); } public void ClientInt(int value) { // Вывести двойное значение типа int this.OriginalInt(value*2); } public void ClientChar(char value) { // Вывести 5 раз значение value for (int i=0; i<5; i++) OriginalChar(value); } } class Client { // Ссылка на клиента private ITarget client; // Конструктор класса Client(ITarget _client) { client = _client; } // Метод, который вызывает все методы интерфейса void Show() { client.ClientDouble(2.88); client.ClientInt(39); client.ClientChar('f'); } } public class TestOrigin { public static void TestClient() { // Тестирование работы клиента - другой способ // 1. Объявить ссылку на интерфейс ITarget ITarget client; // 2. Реализовать адаптацию client = (ITarget) new Adapter(); // 3. Продемонстрировать работу методов client.ClientDouble(3.77); client.ClientInt(255); client.ClientChar('z'); } public static void main(String[] args) { // Объявить экземпляр класса Adapter Adapter adapter = new Adapter(); // Объявить экземпляр класса Client и передатъ ему экземпляр адаптера Client client = new Client(adapter); // Вызвать метод Show() client.Show(); } }
⇑
1.3. Текст программы с решением на языке C#
// Паттерн Адаптер для класса. Решение на языке C# using System; using static System.Console; namespace ConsoleApp10 { // Исходный класс Original, который содержит 3 метода // OriginalDouble(), OriginalInt(), OriginalChar() class Original { public void OriginalDouble(double value) { WriteLine("Method Original.OriginalDouble(), value = {0}", value); } public void OriginalInt(int value) { WriteLine("Method Original.OriginalInt(), value = {0}", value); } public void OriginalChar(char value) { WriteLine("Method Original.OriginalChar, value = {0}", value); } } // Объявить интерфейс ITarget, // который содержит названия методов, которые нужны клиенту interface ITarget { void ClientDouble(double value); void ClientInt(int value); void ClientChar(char value); } // Класс Adapter - реализует интерфейс ITarget, наследует класс Original class Adapter : Original, ITarget { public void ClientDouble(double value) { // в методе ClientDouble() вызвать метод OriginalDouble() OriginalDouble(value); } public void ClientInt(int value) { OriginalInt(value * 2); } public void ClientChar(char value) { for (int i = 0; i < 5; i++) OriginalChar(value); } } // Класс Client - получает ссылку на интерфейс ITarget в конструкторе class Client { private ITarget client; // ссылка на интерфейс ITarget // Конструктор public Client(ITarget _client) { client = _client; } // Метод, который вызывает все методы интерфейса public void Show() { client.ClientDouble(2.88); client.ClientInt(39); client.ClientChar('f'); } } class Program { static void Main(string[] args) { // Демонстрация паттерна Adapter для класса. // 1. Объявить экземпляр класса Adapter Adapter adapter = new Adapter(); // 2. Объявить экземпляр класса Client и передать ему экземпляр адаптера Client client = new Client(adapter); // 3. Вызвать метод Show() клиента client.Show(); } } }
⇑
1.4. Результат работы программы на обоих языках
Method Original.OriginalDouble(), value = 2.88 Method Original.OriginalInt(), value = 78 Method Original.OriginalChar(), value = f Method Original.OriginalChar(), value = f Method Original.OriginalChar(), value = f Method Original.OriginalChar(), value = f Method Original.OriginalChar(), value = f
⇑
2. Решение с использованием паттерна Adapter для объекта
2.1. Структурная схема, отображающая решение задачи
На рисунке 2 изображена структурная схема, которая отображает решение данной задачи с помощью паттерна Adapter для объекта.
Рисунок 2. Паттерн Adapter для объекта. Структурная схема
⇑
2.2. Текст программы с решением на языке Java
Ниже приведен текст модуля, отображающий решение задачи с использованием паттерна Адаптер для объекта.
// Решение задачи. Использование паттерна Adapter для объекта. // Исходный класс Original, содержащий 3 метода: // OriginalDouble(), OriginalInt(), OriginalChar() class Original { void OriginalDouble(double value) { System.out.println("Method Original.OriginalDouble(), value = " + value); } void OriginalInt(int value) { System.out.println("Method Original.OriginalInt(), value = " + value); } void OriginalChar(char value) { System.out.println("Method Original.OriginalChar(), value = " + value); } } // Объявить интерфейс ITarget содержащий названия методов, // которые нужны клиенту interface ITarget { void ClientDouble(double value); void ClientInt(int value); void ClientChar(char value); } // Объявить класс Adapter, реализующий интерфейс ITarget class Adapter implements ITarget { private Original obj; // Объявить ссылку на Original // Конструктор класса - получает ссылку на Original Adapter(Original _obj) { obj = _obj; } // Нужно обязательно реализовать 3 метода интерфейса Original public void ClientDouble(double value) { // здесь вызвать метод OriginalDouble() - замена имени obj.OriginalDouble(value); } public void ClientInt(int value) { // Вывести двойное значение типа int obj.OriginalInt(value*2); } public void ClientChar(char value) { // Вывести 5 раз значение value for (int i=0; i<5; i++) obj.OriginalChar(value); } } // Класс клиента class Client { // Ссылка на клиента private ITarget client; // Конструктор класса Client(ITarget _client) { client = _client; } // Метод, который вызывает все методы интерфейса void Show() { client.ClientDouble(2.88); client.ClientInt(39); client.ClientChar('f'); } } public class TestOrigin { public static void main(String[] args) { // Объявить экземпляр класса Original, который нужно адаптировать // к требованиям класса Client Original obj = new Original(); // Объявить экземпляр класса Adapter с инициализацией его экземпляром Original Adapter adapter = new Adapter(obj); // Объявить экземпляр класса Client и передать ему экземпляр адаптера Client client = new Client(adapter); // Вызвать метод Show() класса Client client.Show(); } }
⇑
2.3. Текст программы с решением на языке C#
Текст решения на языке C# мало чем отличается от решения на языке Java.
// Паттерн Адаптер для объекта. Решение на языке C# using System; using static System.Console; namespace ConsoleApp10 { // Исходный класс Original, который содержит 3 метода // OriginalDouble(), OriginalInt(), OriginalChar() class Original { public void OriginalDouble(double value) { WriteLine("Method Original.OriginalDouble(), value = {0}", value); } public void OriginalInt(int value) { WriteLine("Method Original.OriginalInt(), value = {0}", value); } public void OriginalChar(char value) { WriteLine("Method Original.OriginalChar, value = {0}", value); } } // Объявить интерфейс ITarget, // который содержит названия методов, которые нужны для клиента interface ITarget { void ClientDouble(double value); void ClientInt(int value); void ClientChar(char value); } // Класс Adapter - реализует интерфейс ITarget. // Класс получает входящим параметром ссылку на Original в конструкторе. class Adapter : Original, ITarget { // Ссылка на класс, который нужно адаптировать private Original obj; // Конструктор класса public Adapter(Original obj) { this.obj = obj; } public void ClientDouble(double value) { // всередине метода ClientDouble() вызвать метод OriginalDouble() obj.OriginalDouble(value); } public void ClientInt(int value) { obj.OriginalInt(value * 2); } public void ClientChar(char value) { for (int i = 0; i < 5; i++) obj.OriginalChar(value); } } // Класс Client - получает ссылку на интерфейс ITarget в конструкторе class Client { private ITarget client; // ссылка на интерфейс ITarget // Конструктор public Client(ITarget _client) { client = _client; } // Метод, который вызывает все методы интерфейса public void Show() { client.ClientDouble(2.88); client.ClientInt(39); client.ClientChar('f'); } } class Program { static void Main(string[] args) { // Демонстрация паттерна Adapter для класса. // 1. Объявить экземпляр класса Original Original obj = new Original(); // 2. Объявить экземпляр класса Adapter, передать ему obj Adapter adapter = new Adapter(obj); // 3. Объявить экземпляр класса Client и передать ему экземпляр адаптера Client client = new Client(adapter); // 4. Вызвать метод Show() клиента client.Show(); } } }
⇑
2.4. Результат выполнения программы
Method Original.OriginalDouble(), value = 2.88 Method Original.OriginalInt(), value = 78 Method Original.OriginalChar(), value = f Method Original.OriginalChar(), value = f Method Original.OriginalChar(), value = f Method Original.OriginalChar(), value = f Method Original.OriginalChar(), value = f
⇑
Связанные темы
- Обзор и исследование паттерна. Примеры реализации на C++
- Примеры реализации паттерна Adapter на Java
- Примеры реализации паттерна Adapter на C#
⇑