Структурная модель - режим адаптера (с)

Источник адрес проекта: https: //github.com/ggb2312/JavaNotes/tree/master/design-pattern (шаблоны проектирования соответствующий код и примечания)

1. Определения

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

2. Применимой сцены

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

3. Тип адаптера и роль

адаптер объекта

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

адаптер объекта

Класс адаптера

К классу наследования достичь.

Класс адаптера

Как видно из режима Рисунок адаптера содержит около три роли:

  1. Цель (целевой абстрактный класс): абстрактный класс определяет требуемый интерфейс целевого клиента, или интерфейс является абстрактным классом, класс может быть бетоном. В классе адаптера, потому что язык Java не поддерживает множественное наследование, поэтому он может только интерфейс.

  2. Адаптер (адаптер класс): это может вызвать другой интерфейс, как преобразователь для адаптации адаптируемых и Target. Это является основой шаблона адаптера.

  3. 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

рекомендация

отwww.cnblogs.com/gj-blog/p/10929498.html