Подтвердить что ты не робот

Когда нам нужен шаблон адаптера?

Когда нам нужно перейти на шаблон адаптера? Если возможно, дайте мне пример реального мира, который подходит для этого шаблона...

4b9b3361

Ответ 1

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

Каждый производитель DVR предоставил библиотеку программного обеспечения, позволяющую нам писать код для управления своим устройством (ради этого обсуждения я буду называть его SDK). Несмотря на то, что каждый SDK предоставил API для всех основных функций, ни один из них не был таким же. Вот очень грубый пример, но вы поняли:

  • BeginPlayback (DateTime startTime);
  • StartPlayback (long startTimeTicks);
  • Воспроизведение (строка startDate, строка startTime);

Наше программное обеспечение должно иметь возможность взаимодействовать со всеми DVR. Поэтому вместо того, чтобы писать ужасные коммутаторы/случаи для каждого другого SDK, мы создали наш собственный общий интерфейс IDVRController и написали весь наш системный код для этого интерфейса:

  • Воспроизведение (DateTime startTime);

Затем мы написали другую реализацию адаптера для каждого SDK, все из которых реализовали наш интерфейс IDVRController. Мы использовали конфигурационный файл, чтобы указать тип DVR, к которому подключалась система, и шаблон Factory, чтобы создать экземпляр правильного исполнителя IDVRCконтроллера для этого DVR.

Таким образом, шаблон адаптера упростил наш системный код: мы всегда кодировались в IDVRCконтроллер. И это позволило нам развертывать адаптеры для новых SDK после развертывания (наш Factory используемый рефлекс для создания экземпляра правильного экземпляра IDVRController).

Ответ 2

В компьютерном программировании адаптер (часто называемый обертки или просто обертки) это шаблон проектирования, который переводит один интерфейс для класса в совместимый интерфейс. Адаптер позволяет классам работать вместе обычно не мог из-за несовместимых интерфейсов, предоставляя его интерфейс для клиентов при использовании оригинальный интерфейс. Адаптер переводит вызовы на свой интерфейс в вызовы на исходный интерфейс и количество необходимого кода это обычно невелико. Адаптер также несет ответственность за трансформацию данных в соответствующие формы. Для экземпляр, если несколько булевых значений сохраняются как одно целое, но ваш потребитель требует 'true'/'false', адаптер будет ответственный за извлечение соответствующие значения из целого числа значение.

alt text

Wikipedia!!!

Ответ 3

Шаблон адаптера требуется в следующем сценарии:

Предположим, вы определили интерфейс I1 с помощью метода M1 и M2

C1 и C2 реализует этот интерфейс I1, теперь для C1 при реализации M1 и M2 вы не нашли никакой помощи от других существующих классов, поэтому вам нужно написать всю логику самостоятельно.

Теперь при реализации класса C2 вы столкнулись с классом C3 с методами M3 и M4, которые могут быть использованы для реализации M1 и M2 для C2, поэтому для использования этих M3 и M4 в классе C2 вы расширяете класс C3 и используете M3 и M4 of C3.

В этом примере C2 становится Adapter class и C3 становится adaptee

package com.design.patterns;

public class AdapterExample {
    public static void main(String[] args) {
        Shape line = new LineShape();
        line.draw();

        Shape text = new TextShape();
        text.draw();
    }
}

//==Start from here
interface Shape{
    public void draw();
}

class LineShape implements Shape{
    @Override
    public void draw() {
        System.out.println("write some logic and draw line");
    }   
}

//Adapter
class TextShape extends TextView implements Shape{
    @Override
    public void draw() {
        System.out.println("logic is already there in class TextView");
        drawText();
    }   
}

// Adaptee
class TextView{
    public void drawText() {
        System.out.println("Drawing Text Shape");
    }
}

Ответ 4

Существующий интерфейс

interface Shape {
    public int calculateArea(int r);
}

Текущая реализация для интерфейса формы

class Square implements Shape {
    @Override
    public int calculateArea(int r) {
        return r * r;
    }
}

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

class Circle {
    public double calculateCircularArea (int r) {
        return 3.14 * r * r;
    }
}

Теперь мы адаптируем реализацию Circle к нашему интерфейсу Shape. Поэтому нам нужен адаптер, поскольку они несовместимы.

class CirCleAdaptor extends Circle implements Shape {
    @Override
    public int calculateArea(int r) {
        return (int) calculateCircularArea(r);
    }
}

CircleAdaptor - это адаптер для круга Круг - Адаптация
Форма - это целевой интерфейс

public class AdapterPattern {
    public static void main(String[] args) {
        Shape circle = new CirCleAdaptor();
        System.out.println("Circle Area " + circle.calculateArea(5));
        Shape square = new Square();
        System.out.println("Square Area " + square.calculateArea(5));
    }
}

Надеюсь, это даст лучшее представление о том, когда использовать его.