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 метода интерфейса 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 для объекта.

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

 


Связанные темы