Источник адрес проекта: https: //github.com/ggb2312/JavaNotes/tree/master/design-pattern (шаблоны проектирования соответствующий код и примечания)
1. Определения
Преобразование интерфейса класса в другой интерфейс к ожиданиям клиентов. Режим Адаптер для тех классов, несовместимых интерфейсов могут работать вместе.
2. Применимой сцены
- Существующие классы, методы, и он нуждается не совпадают (одинаковые или подобные методы приводят)
- шаблоны проектирования программного обеспечения не учитываются на стадии проектирования, а также с обслуживанием программного обеспечения. Так как различные продукты, различные производители вызывают аналогичные функции интерфейсные решения не являются таким же, как
3. Тип адаптера и роль
адаптер объекта
В соответствии с принципом комбинации мультиплексирования, с использованием механизма делегирования.
Класс адаптера
К классу наследования достичь.
Как видно из режима Рисунок адаптера содержит около три роли:
Цель (целевой абстрактный класс): абстрактный класс определяет требуемый интерфейс целевого клиента, или интерфейс является абстрактным классом, класс может быть бетоном. В классе адаптера, потому что язык Java не поддерживает множественное наследование, поэтому он может только интерфейс.
Адаптер (адаптер класс): это может вызвать другой интерфейс, как преобразователь для адаптации адаптируемых и Target. Это является основой шаблона адаптера.
Adaptee (адаптированный класс): т. Е адаптация класса адаптированная роль, которая определяет существующий интерфейс Этого интерфейс требует адаптации, слесарь класса завернутые клиент хочет бизнес-методу.
4. Соответствующие шаблоны проектирования
Режим адаптера режим и внешний вид
- Адаптер комплекс, чтобы определить новый интерфейс с существующим интерфейсом, моделями внешнего вида.
Пример 5. Режим
класс 5.1 адаптер
Adaptee имеет класс адаптер:
public class Adaptee {
public void adapteeRequest() {
System.out.println("被适配者的方法");
}
}
Задача Целью является метод интерфейса:
public interface Target {
void request();
}
ConcreteTarget Это цель метода:
/** 具体的实现类 */
public class ConcreteTarget implements Target {
@Override
public void request() {
System.out.println("ConcreteTarget目标方法");
}
}
Адаптер А это класс адаптации: унаследовал классы приспособлены для достижения цели методы интерфейса:
public class Adapter extends Adaptee implements Target {
@Override
public void request() {
super.adapteeRequest();
}
}
Клиент мы должны проверить:
public class Test {
public static void main(String[]args){
Target target = new ConcreteTarget();
target.request();
/** 现在,我们就来通过适配器类来进行实现 */
Target adapterTarget = new Adapter();
adapterTarget.request();
}
}
Результаты тестов:
На этой диаграмме классов:
Адаптер 5.2 Объекта
Существует цель интерфейса:
public interface Target {
void request();
}
Существует определенный целевой класс:
/** 具体的实现类 */
public class ConcreteTarget implements Target {
@Override
public void request() {
System.out.println("ConcreteTarget目标方法");
}
}
И адаптированные классы:
public class Adaptee {
public void adapteeRequest() {
System.out.println("被适配者的方法");
}
}
Выше класс адаптации и есть некоторые различия, здесь адаптированный класс не наследуются, а скорее как совокупность атрибутов внутри, и приспособленными для вызова методов класса внутри объекта:
public class Adapter implements Target {
private Adaptee adaptee = new Adaptee();
@Override
public void request() {
adaptee.adapteeRequest();
}
}
Тест:
public class Test {
public static void main(String[]args){
Target target = new ConcreteTarget();
target.request();
/** 现在,我们就来通过适配器类来进行实现 */
Target adapterTarget = new Adapter();
adapterTarget.request();
}
}
Результаты тестов:
На этой диаграмме классов:
5.3 Adapter демонстрационная
Простая абстрактная сцена: мобильный телефон зарядка потребности в 220 В переменном ток в DC 5V потребность сотового телефона литиевой батареи нашего демо, чтобы написать адаптер питания, в AC220V -> DC5V
Во-первых, есть адаптация класса: класс 220
public class AC220 {
public int outputAC220V() {
int output = 220;
System.out.println("输出220V的交流电"+output+"V");
return output;
}
}
У нас есть интерфейс метода цели: DC 5V в
public interface DC5 {
int outputDC5V();
}
Это класс адаптации (с помощью адаптера объекта):
public class PowerAdapter implements DC5 {
private AC220 ac220 = new AC220();
@Override
public int outputDC5V() {
int adapterInput = ac220.outputAC220V();
/** 变压器 */
int adapterOutput = adapterInput / 44;
System.out.println("通过PowerAdapter电源适配器输入AC"+adapterInput+"V"+"输出DC:"+adapterOutput+"V");
return adapterOutput;
}
}
Тест:
public class Test {
public static void main(String[]args){
DC5 dc5 = new PowerAdapter();
dc5.outputDC5V();
}
}
Результаты тестов:
6. плюсы и минусы
Преимущества:
- Класс может улучшить прозрачность и мультиплексирование мультиплексирования существующего класса, но никаких изменений
- Целевой класс адаптера и класса расцепления, улучшить программу масштабируемости
- В соответствии с принципом открытия и закрытия
Недостатки:
- Писательский адаптер процесс полностью учитывает, что он может увеличить сложность системы
- Увеличение сложности читаемый код системы
7. Расширенная -JDK1.7 и кадр режима адаптера источника
javax.xml.bind.annotation.adapters.XmlAdapter
org.springframework.aop.framework.adapter.AdvisorAdapter, MethodBeforeAdviceAdapter
org.springframework.orm.jpa.JpaVendorAdapter
org.springframework.web.servlet.HandlerAdapter, org.springframework.web.servlet.DispatcherServlet, org.springframework.web.servlet.mvc.Controller