Один шаблон проектирования в день (5) — шаблон адаптера (адаптер)

Java задняя часть Шаблоны проектирования API

предисловие

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

Назначение режима адаптера

Самый классический пример — электроприборы.Вилки ноутбуков, как правило, трехфазные, то есть кроме анода и катода есть еще и заземляющий полюс. В некоторых местах электрические розетки имеют только два полюса и не имеют заземления. Розетка питания не соответствует вилке питания ноутбука, что делает ноутбук непригодным для использования. Затем проблему может решить трехфазный преобразователь (адаптер) в двухфазный, что и делает этот режим.

Форма шаблона адаптера

режим адаптераимеютШаблон адаптера для классовиШаблон адаптера объектадве разные формы.

текст

Шаблон адаптера для классов

Проще говоря, шаблон адаптера класса выглядит так:подходящий классизAPIпреобразовать вцелевой интерфейсизAPI.

Как видно из приведенного выше рисунка,Adapteeкласс неsampleOperation2()метод, в то время какклиентто ожидайте этого метода.

так какклиентможет быть использованAdapteeкласс, который обеспечиваетсредний срок, классAdapter,ПучокAdapteeКатегорияAPIтакой жеTargetинтерфейсAPIсоединять.AdapterиAdapteeдаотношения наследования, который определяет, что этот режим адаптераШаблон адаптера для классов.

Связанная роль

  1. Целевая роль: Это ожидаемый интерфейс. Примечание. Поскольку здесь обсуждается шаблон адаптера класса, цель не может быть классом.
  2. Исходная (адаптируемая) роль: Теперь его нужно адаптировать кцелевая рольтип.
  3. Роль адаптера: адаптер естьцелевая рольиисходная рольмост между. ручка адаптераКласс исходной ролипреобразовать вцелевой интерфейсреализация.

образец кода

Target.java

public interface Target {
    /**
     * 这是源类Adaptee中也有的方法
     */

    public void sampleOperation1();
    /**
     * 这是源类Adaptee中没有的方法
     */
    public void sampleOperation2();
}

приведенное вышецелевая рольКод интерфейса, эта роль реализована в виде интерфейса. Видно, что этоинтерфейсОбъявлены два метода:sampleOperation1()иsampleOperation2()исходная рольAdapteeЯвляетсяконкретный класс, который имеетsampleOperation1()метод, но нетsampleOperation2()метод.

Adaptee.java

public class Adaptee {
    public void sampleOperation1() {
       System.out.println("Operation 1st");
    }
}

Роль адаптераAdapterрасширенныйAdaptee, и в то же время осознаватьцелевая рольTargetинтерфейс. так какAdapteeне предоставленsampleOperation2()метод, в то время какцелевой интерфейсСуществует потребность в этом методе, поэтомуРоль адаптераAdapterвнедрил этот метод.

Adapter.java

public class Adapter extends Adaptee implements Target {
    @Override
    public void sampleOperation2() {
       System.out.println("Operation 2nd");
    }
}

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

иШаблон адаптера для классовТакой же,Шаблон адаптера объектаположить одеялоКласс адаптацииизAPIпреобразовать вцелевой классизAPI.

иШаблон адаптера для классовразница в том,Шаблон адаптера объектане используетсяотношения наследованияСсылка наAdapteeкласс, вместо этого используйтеОтношения делегированияСоединен сAdapteeДобрый.

Как видно из приведенного выше рисунка,Adapteeкласс неsampleOperation2()метод, в то время какклиентто ожидайте этого метода.

Чтобы клиенты могли использоватьAdapteeкласс, который должен предоставить оболочкуWrapperсвоего родаAdapter. Этот класс-оболочка включает в себяAdapteeэкземпляр, так что этоКласс упаковкив состоянии положитьAdapteeизAPIиTargetКатегорияAPIсоединять.Adapterкласс сAdapteeклассОтношения делегирования, что определяетрежим адаптерадаобъектиз.

Связанная роль

  1. Целевая роль: Это ожидаемый интерфейс. Примечание. Поскольку здесь обсуждается шаблон адаптера класса, цель не может быть классом.
  2. Исходная (адаптируемая) роль: Теперь его нужно адаптировать кцелевая рольтип.
  3. Роль адаптера: адаптер естьцелевая рольиисходная рольмост между. ручка адаптераКласс исходной ролиупакован вцелевой интерфейсв реализации.

образец кода

Target.java

public interface Target {
    /**
     * 这是源类Adaptee中也有的方法
     */

    public void sampleOperation1();
    /**
     * 这是源类Adaptee中没有的方法
     */
    public void sampleOperation2();
}

приведенное вышецелевая рольКод интерфейса, эта роль реализована в виде интерфейса. Видно, что этоинтерфейсОбъявлены два метода:sampleOperation1()иsampleOperation2()исходная рольAdapteeЯвляетсяконкретный класс, который имеетsampleOperation1()метод, но нетsampleOperation2()метод.

Adaptee.java

public class Adaptee {
    public void sampleOperation1() {
       System.out.println("Operation 1st");
    }
}

существуетШаблон адаптера объектасередина,Роль адаптерадержит паруисходная роль, и использовать его в методах, которые необходимо адаптироватьисходная рольметод реализован.

Adapter.java

public class Adapter {
    private Adaptee adaptee;

    public Adapter (Adaptee adaptee) {
        this.adaptee = adaptee;
    }

    /**
     * 源类Adaptee有方法sampleOperation1
     * 因此适配器可以直接进行委派
     */
    public void sampleOperation1() {
        this.adaptee.sampleOperation1();
    }

    /**
     * 源类Adaptee没有方法sampleOperation2
     * 因此适配器需要自己实现此方法
     */
    public void sampleOperation2() {
        System.out.println("Operation 2nd");
    }
}

Сравнение двух режимов адаптера

Шаблон адаптера для классов

  1. использоватьнаследование объектовпуть, этостатическийспособ определения.
  2. так какадаптернапрямую унаследовалAdaptee, так чтоадаптерне может иAdapteeподклассы работают вместе. потому что наследованиестатическийотношения, иадаптернаследоватьAdapteeПосле этого невозможно иметь дело сAdapteeизПодкласс.
  3. Адаптеры могут быть переопределеныAdapteeЧасть поведения, эквивалентная подклассуобложкаЧастично реализованные методы родительского класса.
  4. Никаких дополнительных ссылок не требуется, чтобы получить его косвенноAdaptee.

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

  1. использоватькомпозиция объектапуть, этодинамичныйкомбинация.
  2. Адаптер можно поставитьразныеразныеИсточник адаптацииадаптирован к тому жецелевой классначальство. Другими словами, этот же переходник можно поставитьисходный классиего подклассыадаптированы кцелевой интерфейс. Поскольку объектный адаптер используеткомпозиция объектаотношение, пока объекттипПравильно, неважно, подкласс это или нет.
  3. переопределитьAdapteeПоведение более сложное, в этом случае необходимо определитьAdapteeподкласс для реализации переопределения, затем пустьадаптерОбъединение подклассов. Это, добавляя некоторую сложность, также обеспечивает некоторую гибкость.
  4. требует дополнительных ссылок, чтобы получить косвенноAdaptee.

Рекомендуется использоватьобъектный адаптерреализация, многоцелевойСинтез/Агрегация,бесполезныйнаследовать. Конечно, конкретные проблемы еще нужно детально проанализировать, и метод реализации следует выбирать в соответствии с потребностями, причем наиболее подходящий является наилучшим.

Суммировать

Преимущества шаблона адаптера

  • лучшее повторное использование

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

  • лучшая масштабируемость

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

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

излишнийИспользование адаптеров сделает систему оченьгрязный, это не легко понять в целом. Например, отчетливо видно, что вызовAИнтерфейс, по сути, был внутренне адаптирован кBреализация интерфейса. Если в системе слишком много таких ситуаций, это равносильно нештатной катастрофе.

Поэтому, если в этом нет необходимости, систему можно реконструировать напрямую, без использования адаптера.


Добро пожаловать в технический публичный аккаунт: Zero One Technology Stack

零壹技术栈

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