← Назад к вопросам

Для чего использовал паттерн Adapter?

2.0 Middle🔥 91 комментариев
#Паттерны проектирования

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Паттерн Adapter в разработке на Unity: цели и практическое применение

Паттерн Adapter (или Адаптер) я использовал в проектах на Unity для решения ключевой задачи: обеспечения совместной работы несовместимых интерфейсов без изменения их исходного кода. Это структурный паттерн, который действует как "переходник" или "прослойка", преобразующий интерфейс одного класса в интерфейс, ожидаемый другим классом. В контексте игровой разработки это критически важно для поддержания гибкости, расширяемости и чистоты кода.

Основные цели использования Adapter в Unity

  • Интеграция сторонних SDK и плагинов. Unity-проекты часто зависят от внешних сервисов: аналитики (Firebase, Unity Analytics), рекламы (AdMob, AppLovin), социальных функций (PlayFab, Facebook SDK). Каждый SDK имеет свой уникальный API.
    // Допустим, наша игра ожидает универсальный интерфейс для показа рекламы:
    public interface IAdService
    {
        void ShowRewardedAd(string placement);
        bool IsInterstitialReady();
    }
    
    // Но SDK AppLovin имеет совершенно другой набор методов:
    public class AppLovinSDK
    {
        public void ShowRewardedVideo(string adUnitId) { /* ... */ }
        public bool CanShowInterstitial() { /* ... */ }
    }
    
    // Adapter реализует наш интерфейс, "адаптируя" вызовы к SDK:
    public class AppLovinAdapter : IAdService
    {
        private AppLovinSDK _appLovin = new AppLovinSDK();
    
        public void ShowRewardedAd(string placement)
        {
            // Преобразуем наш вызов в вызов, понятный AppLovin
            _appLovin.ShowRewardedVideo("YOUR_AD_UNIT_ID");
        }
    
        public bool IsInterstitialReady()
        {
            return _appLovin.CanShowInterstitial();
        }
    }
    
    Теперь вся игровая логика работает с `IAdService`, а конкретная реализация (AppLovin, AdMob) легко подменяется через Adapter, что упрощает тестирование и миграцию между сервисами.

  • Абстрагирование и унификация систем данных. Игра может загружать данные из разных источников: ScriptableObject, JSON-файлов, адрессable assets или сетевых API. Adapter позволяет создать единый интерфейс для загрузки, скрывая сложности каждого источника.
    public interface IDataLoader<T>
    {
        T LoadData(string key);
    }
    
    // Adapter для работы с ScriptableObject-библиотекой
    public class SOAdapter<T> : IDataLoader<T> where T : UnityEngine.Object
    {
        private SO_Library _library;
        public T LoadData(string key) => _library.GetAsset<T>(key);
    }
    
    // Adapter для загрузки JSON из Resources
    public class JsonResourcesAdapter<T> : IDataLoader<T>
    {
        public T LoadData(string key)
        {
            TextAsset file = Resources.Load<TextAsset>(key);
            return JsonUtility.FromJson<T>(file.text);
        }
    }
    
    Система инвентаря или диалогов будет использовать только `IDataLoader`, не зная, откуда пришли данные.

  • Адаптация Legacy-кода. При рефакторинге старой кодовой базы или интеграции ассетов из Asset Store, Adapter позволяет "обернуть" устаревший или неудобный класс в новый, чистый интерфейс, соответствующий современной архитектуре проекта (например, переход от монолитных MonoBehaviour к системе, основанной на компонентах ECS или чистом C#).

  • Работа с устройствами ввода. Если игра поддерживает несколько схем управления (клавиатура/мышь, геймпад, тачскрин), Adapter может преобразовывать сырые данные ввода (Input.GetAxis, события касаний) в единый формат абстрактных команд ("Прыжок", "Атака"), что делает логику управления независимой от конкретного устройства.

Преимущества в контексте Unity

  • Соблюдение принципа открытости/закрытости (Open/Closed Principle): Можно добавлять новые адаптеры для новых сервисов, не изменяя существующий клиентский код.
  • Упрощение юнит-тестирования: Зависимости (например, сетевые сервисы) легко подменяются Mock-адаптерами в тестовом окружении.
  • Снижение связанности (Low Coupling): Код игры зависит от абстракций (IAdService, IDataLoader), а не от конкретных реализаций.
  • Повышение читаемости и поддерживаемости: Клиентский код становится чище и понятнее, так как он оперирует понятиями предметной области игры, а не деталями интеграции.

Итог: Паттерн Adapter в Unity — это не просто "костыль" для несовместимых библиотек, а мощный инструмент архитектора для создания модульной, тестируемой и легко расширяемой codebase. Он позволяет изолировать области нестабильности (внешние SDK, данные) и предоставить игровым системам стабильный, предсказуемый интерфейс для работы.

Для чего использовал паттерн Adapter? | PrepBro