Случайный разговор: Как объяснить девушке, что такое шаблон адаптера?

задняя часть Шаблоны проектирования
Случайный разговор: Как объяснить девушке, что такое шаблон адаптера?

По выходным я дома играл в King of Glory Моя девушка играла на моем компьютере рядом со мной Я думал, что варьете, которую она играла, было громко, поэтому я предложил ей надеть наушники.

режим адаптера

Шаблон адаптера, обычно переводимый в шаблон адаптера, иногда называемый шаблоном-оболочкой, является одним из 23 шаблонов проектирования в GOF. Основная функция — преобразовать интерфейс класса в другой интерфейс, который хочет клиент. Шаблон адаптера позволяет классам работать вместе, которые в противном случае не работали бы вместе из-за несовместимых интерфейсов.

«Шаблоны проектирования: элементы многоразового объектно-ориентированного программного обеспечения» («Шаблоны проектирования»), коллективно Эрих Гамма, Ричард Хелм, Ральф Джонсон и Джон Влиссидес (Addison-Wesley, 1995). Этих авторов часто называют «Бандой четырех», именуемой GOF.

Режим адаптера делится на режим адаптера класса и режим адаптера объекта в GOF.

Шаблон адаптера объекта

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

шаблон адаптера класса

В этом режиме адаптера адаптер наследуется от реализованного класса (вообще многонационального наследования).

Разница между ними заключается только в том, что адаптация роли адаптера к адаптированной роли достигается путем наследования или комбинации.Поскольку множественное наследование не поддерживается в Java, а режим адаптера класса подозревается в разрушении инкапсуляции, мы также выступаем за мульти- использовать комбинацию и меньше использовать.наследовать.Таким образом, эта статья в основном вводит адаптер объекта.

Использование режима адаптера

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

В настоящее время многие разъемы для мобильных телефонов на рынке относятся к моделям типа C или Lightning:

Тем не менее, наши широко используемые модели наушников имеют круглые разъемы 2,5 мм и 3,5 мм:

Итак, когда мы хотим вставить наушники с круглым интерфейсом 3,5 мм в интерфейс Lightning или Type-C, вам понадобится конвертер:
Точно так же в программной системе некоторые «существующие объекты» часто помещаются в новую среду, в то время как интерфейс, требующий новой среды, заключается в том, что объект не может быть удовлетворен. А именно: Следующие сценарии:

1. Системе необходимо использовать существующий класс, а интерфейс этого класса не соответствует потребностям системы.

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

3. Вставить класс в другую систему классов через преобразование интерфейса. (Например, тигры и птицы, теперь есть летающий тигр. Не увеличивая потребности сущностей, добавлен адаптер, содержащий объект тигра и реализующий интерфейс полета.)

Режим адаптера может решить вышеуказанные проблемы.

Реализация режима адаптера

Давайте воспользуемся режимом адаптера для имитации сценария: используйте зарядное устройство Android type-c для зарядки телефона Apple, который поддерживает только интерфейс Lightning (при условии, что он может поддерживаться идеально).

Известно, что у нас есть зарядное устройство type-c, разъем Lightning для iPhone. Будь то type-c или Lightning, это стандарт, в коде стандартом является интерфейс. Итак, мы сначала определяем два интерфейса:

/**
 * Lightning充电接口
 */
public interface LightningInterface {
    public void chargeWithLightning();
}

/**
 * TypeC充电接口
 */
public interface TypeCInterface {
    public void chargeWithTypeC();
}

Далее определяем наш iPhone, который поддерживает зарядку только через разъем Lightning:

public class IphoneX {

    private LightningInterface lightningInterface;

    public IphoneX() {
    }

    public IphoneX(LightningInterface lightningInterface) {
        this.lightningInterface = lightningInterface;
    }

    public void charge() {
        System.out.println("开始给我的IphoneX手机充电...");
        lightningInterface.chargeWithLightning();
        System.out.println("结束给我的IphoneX手机充电...");
    }
    //setter/getter
}

Затем давайте посмотрим, как должно быть определено наше зарядное устройство для Android:

/**
 * 安卓设备的充电器
 */
public class AndroidCharger implements TypeCInterface {
    @Override
    public void chargeWithTypeC() {
        System.out.println("使用Type-C型号的充电器充电...");
    }
}

С зарядным устройством для Android и iphone. Далее нам нужно определить адаптер, Мы надеемся, что с помощью этого адаптера мы сможем использовать зарядное устройство Android-устройства для зарядки мобильного телефона Apple:

public class Adapter implements LightningInterface {
    private TypeCInterface typeCInterface;

    public Adapter() {
    }

    public Adapter(TypeCInterface typeCInterface) {
        typeCInterface = typeCInterface;
    }

    @Override
    public void chargeWithLightning() {
        typeCInterface.chargeWithTypeC();
    }

    //setter/getter
}

Этот адаптер реализует LightningInterface и сочетает в себе TypeCInterface. Когда метод свидетельствующего заряда называется внешне, метод TypeCInterFace.ComeWithTyPec на самом деле называется.

Как и адаптер питания, он реализует спецификацию Lightning, сам штекер Lightning, но фактическая зарядка, он по мощности typec-c, играет роль промежуточного преобразования.

Затем мы определяем клиент, чтобы реализовать функцию зарядки, которую мы хотим:

public class Main {
    public static void main(String[] args) {

            Adapter adapter  = new Adapter(new AndroidCharger());
            IphoneX iphoneX = new IphoneX();
            iphoneX.setLightningInterface(adapter);
            iphoneX.charge();
        }
}

Результат выглядит следующим образом:

开始给我的IphoneX手机充电...
使用Type-C型号的充电器充电...
结束给我的IphoneX手机充电...

В приведенном выше примере мы используем зарядное устройство Android type-c для зарядки iPhone, который поддерживает только порт Lightning через адаптер.

Вышеприведенный код является примером шаблона адаптера.В этом примере есть четыре роли:

Среди вышеуказанных четырех ролей целевой абстрактный класс (интерфейс молнии), класс адаптера (зарядное устройство Android), а клиент (Apple Phone) находятся в исходном коде, и нам не нужно их изменять. Просто введите адаптер (преобразователь интерфейса).

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

преимущество

Режим адаптера (режим адаптера объекта) является достижение превосходной комбинации интегрированных идей. Используя режим адаптера, мы можем максимизировать повторное использование существующих классов и кода. В основном он имеет следующие преимущества:

  • Отделите целевой класс от класса адаптера и повторно используйте существующий класс адаптера, введя класс адаптера без изменения исходного кода.

  • Повышается прозрачность и возможность повторного использования класса, а конкретная реализация инкапсулируется в класс адаптера, который прозрачен для клиентского класса и улучшает возможность повторного использования адаптера.

  • Гибкость и расширяемость очень хорошие, с помощью конфигурационного файла можно легко заменить адаптер и добавить новые классы адаптера без изменения исходного кода, что полностью соответствует принципу «открыто-закрыто».

недостаток

Конечно, режим адаптера не идеален, и чрезмерное использование все же может вызвать некоторые проблемы. Недостатки следующие:

  • Чрезмерное использование адаптеров сделает систему очень грязной и трудной для понимания в целом. Например, очевидно, что вызывается интерфейс А, но на самом деле он внутренне приспособлен к реализации интерфейса Б. Если таких ситуаций в системе слишком много, это равносильно катастрофе. Поэтому, если в этом нет необходимости, можно напрямую рефакторить систему без использования адаптера.

сцены, которые будут использоваться

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

Во фреймворке Spring широко используется режим адаптера, читатели могут открыть свою IDE и попытаться выполнить глобальный поиск по ключевому слову «Адаптер», и будет много практических применений.

Когда вы сталкиваетесь с проблемой, похожей на то, когда вы хотите использовать зарядное устройство Android для зарядки iPhone, вы должны подумать о режиме адаптера!

Это третья статья о шаблонах проектирования.Первые две статьи: "Rambling: Как объяснить своей девушке, в чем заключается схема стратегии?""Случайный разговор: как объяснить моей девушке, что такое шаблон синглтона?》Какой шаблон проектирования вы хотите изучить, пожалуйста, оставьте сообщение.