предисловие
режим адаптераположить одининтерфейс классапревратиться вклиентожидалдругой интерфейс, так что первопричинанесоответствие интерфейсане в состоянии работать вместедва классаспособны работать вместе.
Назначение режима адаптера
Самый классический пример — электроприборы.Вилки ноутбуков, как правило, трехфазные, то есть кроме анода и катода есть еще и заземляющий полюс. В некоторых местах электрические розетки имеют только два полюса и не имеют заземления. Розетка питания не соответствует вилке питания ноутбука, что делает ноутбук непригодным для использования. Затем проблему может решить трехфазный преобразователь (адаптер) в двухфазный, что и делает этот режим.
Форма шаблона адаптера
режим адаптераимеютШаблон адаптера для классовиШаблон адаптера объектадве разные формы.
текст
Шаблон адаптера для классов
Проще говоря, шаблон адаптера класса выглядит так:подходящий классизAPIпреобразовать вцелевой интерфейсизAPI.
Как видно из приведенного выше рисунка,Adapteeкласс неsampleOperation2()метод, в то время какклиентто ожидайте этого метода.
так какклиентможет быть использованAdapteeкласс, который обеспечиваетсредний срок, классAdapter,ПучокAdapteeКатегорияAPIтакой жеTargetинтерфейсAPIсоединять.AdapterиAdapteeдаотношения наследования, который определяет, что этот режим адаптераШаблон адаптера для классов.
Связанная роль
- Целевая роль: Это ожидаемый интерфейс. Примечание. Поскольку здесь обсуждается шаблон адаптера класса, цель не может быть классом.
- Исходная (адаптируемая) роль: Теперь его нужно адаптировать кцелевая рольтип.
- Роль адаптера: адаптер естьцелевая рольиисходная рольмост между. ручка адаптераКласс исходной ролипреобразовать вцелевой интерфейсреализация.
образец кода
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классОтношения делегирования, что определяетрежим адаптерадаобъектиз.
Связанная роль
- Целевая роль: Это ожидаемый интерфейс. Примечание. Поскольку здесь обсуждается шаблон адаптера класса, цель не может быть классом.
- Исходная (адаптируемая) роль: Теперь его нужно адаптировать кцелевая рольтип.
- Роль адаптера: адаптер естьцелевая рольиисходная рольмост между. ручка адаптераКласс исходной ролиупакован вцелевой интерфейсв реализации.
образец кода
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");
}
}
Сравнение двух режимов адаптера
Шаблон адаптера для классов
- использоватьнаследование объектовпуть, этостатическийспособ определения.
- так какадаптернапрямую унаследовал
Adaptee, так чтоадаптерне может иAdapteeподклассы работают вместе. потому что наследованиестатическийотношения, иадаптернаследоватьAdapteeПосле этого невозможно иметь дело сAdapteeизПодкласс. - Адаптеры могут быть переопределены
AdapteeЧасть поведения, эквивалентная подклассуобложкаЧастично реализованные методы родительского класса. - Никаких дополнительных ссылок не требуется, чтобы получить его косвенно
Adaptee.
Шаблон адаптера объекта
- использоватькомпозиция объектапуть, этодинамичныйкомбинация.
- Адаптер можно поставитьразныеразныеИсточник адаптацииадаптирован к тому жецелевой классначальство. Другими словами, этот же переходник можно поставитьисходный классиего подклассыадаптированы кцелевой интерфейс. Поскольку объектный адаптер используеткомпозиция объектаотношение, пока объекттипПравильно, неважно, подкласс это или нет.
- переопределить
AdapteeПоведение более сложное, в этом случае необходимо определитьAdapteeподкласс для реализации переопределения, затем пустьадаптерОбъединение подклассов. Это, добавляя некоторую сложность, также обеспечивает некоторую гибкость. - требует дополнительных ссылок, чтобы получить косвенно
Adaptee.
Рекомендуется использоватьобъектный адаптерреализация, многоцелевойСинтез/Агрегация,бесполезныйнаследовать. Конечно, конкретные проблемы еще нужно детально проанализировать, и метод реализации следует выбирать в соответствии с потребностями, причем наиболее подходящий является наилучшим.
Суммировать
Преимущества шаблона адаптера
- лучшее повторное использование
Системе необходимо использовать существующий класс, поэтому интерфейс класса не соответствует потребностям системы. Тогда эти функции можно будет лучше использовать повторно через режим адаптера.
- лучшая масштабируемость
При реализации функции адаптера вы можете вызвать функцию, разработанную самостоятельно, чтобы естественным образом расширить функцию системы.
Недостатки шаблона адаптера
излишнийИспользование адаптеров сделает систему оченьгрязный, это не легко понять в целом. Например, отчетливо видно, что вызовAИнтерфейс, по сути, был внутренне адаптирован кBреализация интерфейса. Если в системе слишком много таких ситуаций, это равносильно нештатной катастрофе.
Поэтому, если в этом нет необходимости, систему можно реконструировать напрямую, без использования адаптера.
Добро пожаловать в технический публичный аккаунт: Zero One Technology Stack
Эта учетная запись будет продолжать делиться сухими продуктами серверных технологий, включая основы виртуальных машин, многопоточное программирование, высокопроизводительные фреймворки, асинхронное ПО, промежуточное ПО для кэширования и обмена сообщениями, распределенные и микросервисы, материалы для обучения архитектуре и расширенные учебные материалы и статьи.