Patterns. Розв’язок задачі з використанням паттерну Адаптер на Java та C#. Лабораторна робота. Адаптація трьох методів




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

Паттерн 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 для об’єкту.

Паттерн 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

 


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