По выходным я дома играл в King of Glory Моя девушка играла на моем компьютере рядом со мной Я думал, что варьете, которую она играла, было громко, поэтому я предложил ей надеть наушники.
режим адаптера
Шаблон адаптера, обычно переводимый в шаблон адаптера, иногда называемый шаблоном-оболочкой, является одним из 23 шаблонов проектирования в GOF. Основная функция — преобразовать интерфейс класса в другой интерфейс, который хочет клиент. Шаблон адаптера позволяет классам работать вместе, которые в противном случае не работали бы вместе из-за несовместимых интерфейсов.
«Шаблоны проектирования: элементы многоразового объектно-ориентированного программного обеспечения» («Шаблоны проектирования»), коллективно Эрих Гамма, Ричард Хелм, Ральф Джонсон и Джон Влиссидес (Addison-Wesley, 1995). Этих авторов часто называют «Бандой четырех», именуемой GOF.
Режим адаптера делится на режим адаптера класса и режим адаптера объекта в GOF.
Шаблон адаптера объекта
В этом шаблоне адаптера адаптер содержит экземпляр класса, который он обертывает. В этом случае адаптер вызывает физический объект обернутого объекта.
шаблон адаптера класса
В этом режиме адаптера адаптер наследуется от реализованного класса (вообще многонационального наследования).
Разница между ними заключается только в том, что адаптация роли адаптера к адаптированной роли достигается путем наследования или комбинации.Поскольку множественное наследование не поддерживается в Java, а режим адаптера класса подозревается в разрушении инкапсуляции, мы также выступаем за мульти- использовать комбинацию и меньше использовать.наследовать.Таким образом, эта статья в основном вводит адаптер объекта.
Использование режима адаптера
В нашей жизни часто приходится использовать преобразователи розеток, например, многие мобильные телефоны теперь имеют только одну розетку, которую можно напрямую использовать для зарядки и прослушивания музыки. Но предполагается, что разъемы зарядного устройства и наушников, которые мы используем, должны быть совместимы с этим устройством.
В настоящее время многие разъемы для мобильных телефонов на рынке относятся к моделям типа C или Lightning:
Тем не менее, наши широко используемые модели наушников имеют круглые разъемы 2,5 мм и 3,5 мм:
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 через адаптер.
Вышеприведенный код является примером шаблона адаптера.В этом примере есть четыре роли:
Преимущества и недостатки
преимущество
Режим адаптера (режим адаптера объекта) является достижение превосходной комбинации интегрированных идей. Используя режим адаптера, мы можем максимизировать повторное использование существующих классов и кода. В основном он имеет следующие преимущества:
Отделите целевой класс от класса адаптера и повторно используйте существующий класс адаптера, введя класс адаптера без изменения исходного кода.
Повышается прозрачность и возможность повторного использования класса, а конкретная реализация инкапсулируется в класс адаптера, который прозрачен для клиентского класса и улучшает возможность повторного использования адаптера.
Гибкость и расширяемость очень хорошие, с помощью конфигурационного файла можно легко заменить адаптер и добавить новые классы адаптера без изменения исходного кода, что полностью соответствует принципу «открыто-закрыто».
недостаток
Конечно, режим адаптера не идеален, и чрезмерное использование все же может вызвать некоторые проблемы. Недостатки следующие:
Чрезмерное использование адаптеров сделает систему очень грязной и трудной для понимания в целом. Например, очевидно, что вызывается интерфейс А, но на самом деле он внутренне приспособлен к реализации интерфейса Б. Если таких ситуаций в системе слишком много, это равносильно катастрофе. Поэтому, если в этом нет необходимости, можно напрямую рефакторить систему без использования адаптера.
сцены, которые будут использоваться
Что касается сценариев использования режима адаптера, режим адаптера обычно рассматривается, когда нам нужно изменить какой-либо работающий код и надеяться, что исходный код можно будет повторно использовать для достижения новых функций.
Во фреймворке Spring широко используется режим адаптера, читатели могут открыть свою IDE и попытаться выполнить глобальный поиск по ключевому слову «Адаптер», и будет много практических применений.
Когда вы сталкиваетесь с проблемой, похожей на то, когда вы хотите использовать зарядное устройство Android для зарядки iPhone, вы должны подумать о режиме адаптера!
Это третья статья о шаблонах проектирования.Первые две статьи: "Rambling: Как объяснить своей девушке, в чем заключается схема стратегии?""Случайный разговор: как объяснить моей девушке, что такое шаблон синглтона?》Какой шаблон проектирования вы хотите изучить, пожалуйста, оставьте сообщение.