Розв’язок задачі з використанням паттерну Адаптер на 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 методи інтерфейсу ITarget 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#
⇑