Java. Adapter Pattern in Game Server

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.
Adapter
Adapter

Адаптер - это шаблон структурного проектирования, который позволяет объектам с несовместимыми интерфейсами взаимодействовать друг с другом.

Так же известен как “Обертка”.

Проблема

Чтобы продемонстрировать этот шаблон, я буду использовать упрощенный пример игровой механики, в которой есть интерфейс IEnemy, но один из врагов отличается от других и не имеет реализации метода атаки. Вместо этого, этот конкретный враг (SpecialEnemy) накладывает заклинания .

Решение

Вы можете создать адаптер. Это специальный объект, который преобразует интерфейс одного объекта, чтобы другой объект мог его понять. Адаптер оборачивает один из объектов, чтобы скрыть сложность преобразования, происходящего за кулисами. Обернутый объект даже не знает об адаптере. Например, вы можете обернуть объект, который работает в метрах и километрах, с помощью адаптера, который преобразует все данные в британские единицы, такие как футы и мили. Адаптеры могут не только преобразовывать данные в различные форматы, но также могут помогать объектам с разными интерфейсами взаимодействовать друг с другом. Вот как это работает:

  1. Адаптер получает интерфейс, совместимый с одним из существующих объектов.

  2. Используя этот интерфейс, существующий объект может безопасно вызывать методы адаптера.

  3. При получении вызова адаптер передает запрос второму объекту, но в формате и порядке, которые ожидает второй объект.

Иногда даже можно создать двусторонний адаптер, который может конвертировать вызовы в обоих направлениях. Вернемся к нашему игровому приложению. Чтобы решить дилемму несовместимых врагов, вы можете создать адаптер EnemyAdapter для каждого класса особенных врагов, с которым ваш код работает напрямую. Затем вы настраиваете свой код для связи с SpecialEnemy только через эти адаптеры. Когда адаптер получает вызов, он переводит входящие атаки в кастование спеллов.

Структура

Существует несколько видов адаптеров

Object adapter В этой реализации используется принцип композиции объектов: адаптер реализует интерфейс одного объекта и обертывает другой. Его можно реализовать на всех популярных языках программирования. Class adapter В этой реализации используется наследование: адаптер наследует интерфейсы от обоих объектов одновременно. Обратите внимание, что этот подход может быть реализован только в языках программирования, поддерживающих множественное наследование, таких как C ++.

Применимость

Используйте класс Adapter, если вы хотите использовать какой-либо существующий класс, но его интерфейс несовместим с остальной частью вашего кода.

Шаблон адаптера позволяет вам создать класс среднего уровня, который служит транслятором между вашим кодом и унаследованным классом, сторонним классом или любым другим классом со странным интерфейсом.

Используйте шаблон, если вы хотите повторно использовать несколько существующих подклассов, в которых отсутствуют некоторые общие функции и нельзя добавить в суперкласс.

Вы можете расширить каждый подкласс и добавить недостающие функции в новые дочерние классы. Однако вам придется продублировать код во всех этих новых классах, что очень плохо "пахнет".

Гораздо более элегантным решением было бы поместить недостающие функции в класс адаптера. Затем вы должны обернуть объекты с недостающими функциями внутри адаптера, динамически получая необходимые функции. Чтобы это работало, целевые классы должны иметь общий интерфейс, а поле адаптера должно следовать за этим интерфейсом. Этот подход очень похож на шаблон Decorator.

Реализация

Добавляем специальных врагов.

Создадим класс SpecialEnemy, использующий метод CastSpell.

class SpecialEnemy {
  public String castSpell() {
     return "using spell";
  }
}

Я буду использовать строку возврата, чтобы упростить процесс.

Затем, создадим интерфейс IEnemy для управления поведением врагов, в данном случае это только один метод для атаки

interface IEnemy {
  String attack();
}

Теперь нам нужно реализовать этот интерфейс в классе EnemyAdapter, который соединит обе части вместе.

class EnemyAdapter implements IEnemy {
  SpecialEnemy e = new SpecialEnemy();

  public string attack() {
     return e.CastSpell();
  }
}

Нам нужно добавить ссылку на SpecialEnemy, чтобы иметь доступ к методу CastSpell. Таким образом, мы можем использовать метод атаки без реализации его в SpecialEnemy. Или мы можем создать конструктор и передать туда экземпляр SpecialEnemy.

class EnemyAdapter implements IEnemy {
  SpecialEnemy e;

  EnemyAdapter(SpecialEnemy se) {
    this.e = se;
  }

  public string attack() {
     return e.CastSpell();
  }
}

Последний шаг - вызвать метод Enemy Attack в клиентском классе.

class Main {

  public static void main(String[] args) {

    IEnemy enemy = new EnemyAdapter();
    System.out.println(enemy.Attack());
  }
}

В качестве вывода мы получаем строку «использование заклинания». Этот пример был слишком упрощен, но он демонстрирует идею, лежащую в основе этого простого шаблона. Надеюсь, он вам понравился и был полезен.

Источник: https://habr.com/ru/post/577220/


Интересные статьи

Интересные статьи

Иногда при анализе производительности запроса на предмет "куда ушло все время" возникает стойкое ощущение deja vu, что вот ровно этот же кусок плана ты уже где-то раньше видел...Пролистываешь выше - и...
Вячеслав Уточкин, директор образовательных программ по игровой индустриии в Высшей школе бизнес-информатики НИУ ВШЭ организовал круглый стол gamedev-практиков «Как создать свой игрово...
Многие компании в определенный момент приходят к тому, что ряд процессов в бизнесе нужно автоматизировать, чтобы не потерять свое место под солнцем и своих заказчиков. Поэтому все...
При работе с UITableView хотелось избежать написания шаблонного кода, который еще больше усложняется, если нужно обновлять состояние таблицы анимировано. Apple представила свое реше...
Многие слышали название GraalVM, но опробовать эту технологию в продакшене пока довелось не всем. Для Однокласснииков эта технология уже стала «священным Граалем», меняющим фронтенд. В это...