Разница между мостовой схемой и Адаптерной схемой

StackOverflow https://stackoverflow.com/questions/1425171

  •  07-07-2019
  •  | 
  •  

Вопрос

В чем разница между шаблонами моста и адаптера?

Это было полезно?

Решение

"Адаптер заставляет вещи работать после того, как они спроектированы;Бридж заставляет их работать до того, как они появятся.[GoF, стр. 219]"

Фактически, Адаптер шаблон полезен, когда у вас есть существующий код, будь то сторонний или собственный, но находящийся вне вашего контроля или иным образом не изменяемый, чтобы полностью соответствовать нужному вам интерфейсу.Например, у нас есть набор супероружий, который может управлять множеством устройств судного дня.

public class SuperWeaponsArray {
  /*...*/

  public void destroyWorld() {
    for (Weapon w : armedWeapons) {
      w.fire();
    }
  }
}

Отлично.За исключением того, что мы понимаем, что в нашем арсенале есть ядерное устройство, которое значительно предшествовало переходу на оружейный интерфейс.Но нам бы очень хотелось, чтобы это сработало здесь...итак, что же нам делать?..вклинись в него!

NukeWeaponsAdaptor основан на нашем классе Nuke, но экспортирует интерфейс оружия.Милая, теперь мы наверняка можем уничтожить весь мир.Это кажется немного запутанным, но это заставляет все работать.


Тот Самый Мост шаблон - это то, что вы реализуете заранее - если вы знаете, что у вас есть две ортогональные иерархии, это обеспечивает способ разделить интерфейс и реализацию таким образом, чтобы вы не получили безумное количество классов.Допустим, у вас есть:

Типы файловых объектов MemoryMappedFile и DirectReadFile.Допустим, вы хотите иметь возможность читать файлы из разных источников (возможно, Linux противРеализации Windows и т.д.).Бридж поможет вам избежать проблем с:

MemoryMappedWindowsFile MemoryMappedLinuxFile DirectReadWindowsFile DirectReadLinuxFile

Другие советы

http://en.wikipedia.org/wiki/Adapter_pattern

Шаблон Adapter больше о том, как заставить существующий код работать с более новой системой или интерфейсом.

Если у вас есть набор стандартных API веб-сервисов компании, которые вы хотели бы предложить существующему интерфейсу расширяемости другого приложения, вы можете написать набор адаптеров для этого. Обратите внимание, что есть серая область, и это больше о том, как вы технически определяете шаблон, так как другие шаблоны, такие как фасад, похожи.

http://en.wikipedia.org/wiki/Bridge_pattern

Шаблон Bridge позволит вам иметь альтернативные реализации алгоритма или системы.

Хотя это и не классический пример паттерна Bridge, представьте, что у вас есть несколько реализаций хранилища данных: одно эффективно в пространстве, другое эффективно в необработанной производительности ... и у вас есть экономическое обоснование для того, чтобы предложить и то, и другое. приложение или фреймворк.

С точки зрения вашего вопроса, "где я могу использовать какой шаблон", " Ответ в том, где это имеет смысл для вашего проекта! Возможно, стоит подумать о том, чтобы предложить правку с разъяснениями, чтобы обсудить, где, по вашему мнению, вам нужно использовать один или другой.

Адаптер:

  1. Это структурный паттерн
  2. Полезно работать с двумя несовместимыми интерфейсами

Диаграмма UML: От фабрика Статья:

enter image description here

Цель :определяет специфичный для домена интерфейс, который использует Клиент.

Адаптер :адаптирует Адаптируемый интерфейс к Целевому интерфейсу.

Адаптируемый :определяет существующий интерфейс, который нуждается в адаптации.

Клиент :взаимодействует с объектами, соответствующими Целевому интерфейсу.

Пример:

Квадрат и Прямоугольник - это две разные формы, и для получения area() каждой из них требуются разные методы.Но все же Square работает над прямоугольным интерфейсом с преобразованием некоторых свойств.

public class AdapterDemo{
    public static void main(String args[]){
        SquareArea s = new SquareArea(4);
        System.out.println("Square area :"+s.getArea());
    }
}

class RectangleArea {
    public int getArea(int length, int width){
        return length * width;
    }
}

class SquareArea extends RectangleArea {

    int length;
    public SquareArea(int length){
        this.length = length;
    }
    public int getArea(){
        return getArea(length,length);
    }
}

Мост:

  1. Это структурный паттерн
  2. он отделяет абстракцию от ее реализации, и то и другое может варьироваться независимо
  3. Это возможно, потому что композиция была использована вместо наследования

Редактировать: ( согласно предложению @quasoft)

В этом шаблоне у вас есть четыре компонента.

  1. Абстракция:Он определяет интерфейс

  2. Усовершенствованная абстракция:Он реализует абстракцию:

  3. Исполнитель:Он определяет интерфейс для реализации

  4. Конкретный элемент:Он реализует интерфейс разработчика.

Фрагмент кода:

Gear gear = new ManualGear();
Vehicle vehicle = new Car(gear);
vehicle.addGear();

gear = new AutoGear();
vehicle = new Car(gear);
vehicle.addGear();

Связанный пост:

Когда вы используете шаблон Моста?Чем он отличается от шаблона адаптера?

Ключевые отличия: От создание исходных текстов Статья

  1. Адаптер заставляет вещи работать после того, как они спроектированы;Бридж заставляет их работать до того, как они заработают.
  2. Мост спроектирован заранее, чтобы позволить абстракции и реализации изменяться независимо.Адаптер модифицирован таким образом, чтобы заставить несвязанные классы работать вместе.

Этот пост был довольно давно. Тем не менее, важно понимать, что фасад чем-то похож на адаптер, но это не совсем то же самое. Адаптер "адаптирует" существующий класс для обычно несовместимого клиентского класса. Допустим, у вас есть старая система рабочего процесса, которую ваше приложение использует в качестве клиента. Ваша компания может заменить систему документооборота на новую "несовместимую". один (с точки зрения интерфейсов). В большинстве случаев вы можете использовать шаблон адаптера и написать код, который фактически вызывает интерфейсы нового механизма рабочего процесса. Мост, как правило, используется по-другому. Если у вас действительно есть система, которая должна работать с различными файловыми системами (например, локальный диск, NFS и т. Д.), Вы можете использовать шаблон моста и создать один уровень абстракции для работы со всеми вашими файловыми системами. В основном это будет простой вариант использования шаблона моста. Фасад и адаптер имеют некоторые общие свойства, но фасады обычно используются для упрощения существующего интерфейса / класса . В первые дни EJB не было местных вызовов для EJB. Разработчики всегда получали заглушку, сужали ее и называли «псевдо-удаленно». Это часто вызывало проблемы с производительностью (особенно, когда звонили по проводам). Опытные разработчики будут использовать шаблон фасада для обеспечения очень грубого интерфейса с клиентом. Этот фасад, в свою очередь, будет выполнять несколько вызовов различных более детальных методов. В целом это значительно сократило количество требуемых вызовов методов и повысило производительность.

Предположим, у вас есть абстрактный класс Shape с (обобщенной / абстрактной) функциональностью рисования и кругом, который реализует Shape. Мост-паттерн - это просто двусторонний подход к абстракции для разделения реализации (рисование в круге) и универсальной / абстрагированной функциональности (рисование в классе Shape).

Что это на самом деле означает? На первый взгляд, это звучит как то, что вы уже делаете (путем инверсии зависимостей). Так что не стоит беспокоиться о том, что у вас есть менее ридиг или более модульная кодовая база. Но за этим стоит более глубокая философия.

Насколько я понимаю, необходимость использования шаблона может возникнуть, когда мне нужно добавить новые классы, которые тесно связаны с текущей системой (например, RedCircle или GreenCircle) и которые отличаются только одной функциональностью (например, цветом). И мне понадобится паттерн Bridge, особенно, если существующие системные классы (Circle или Shape) нужно часто менять, и вы не хотите, чтобы на вновь добавленные классы влияли эти изменения. Вот почему общая функциональность рисования абстрагируется в новый интерфейс, так что вы можете изменять поведение рисования независимо от формы или круга.

Bridge - улучшенный адаптер. Мост включает адаптер и добавляет дополнительную гибкость к нему. Вот как элементы из ответов Равиндры отображаются между шаблонами:

      Adapter  |    Bridge
    -----------|---------------
    Target     | Abstraction
    -----------|---------------
               | RefinedAbstraction
               |
               |   This element is Bridge specific. If there is a group of 
               |   implementations that share the same logic, the logic can be placed here.
               |   For example, all cars split into two large groups: manual and auto. 
               |   So, there will be two RefinedAbstraction classes.
    -----------|--------------- 
    Adapter    | Implementor
    -----------|---------------
    Adaptee    | ConcreteImplementor
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top