Разница между образцом моста и образцом адаптера - PullRequest
101 голосов
/ 15 сентября 2009

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

Ответы [ 6 ]

153 голосов
/ 15 сентября 2009

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

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

public class SuperWeaponsArray {
  /*...*/

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

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

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


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

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

MemoryMappedWindowsFile MemoryMappedLinuxFile DirectReadWindowsFile DirectReadLinuxFile

13 голосов
/ 15 сентября 2009

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

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

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

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

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

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

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

9 голосов
/ 10 февраля 2016

адаптер:

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

Диаграмма UML: из справочный завод артикул:

enter image description here

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

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

Adaptee : определяет существующий интерфейс, который необходимо адаптировать.

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

* +1047 * Пример: * 1 049 * Квадрат и Прямоугольник - две разные фигуры, и для получения области () каждой из них требуются разные методы. Но все же Square работает над интерфейсом Rectangle с преобразованием некоторых свойств. 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); } } мост: Это структурный рисунок он отделяет абстракцию от своей реализации, и оба могут варьироваться независимо Это возможно, потому что вместо наследства использовалась композиция РЕДАКТИРОВАТЬ: (согласно предложению @quasoft) В этом шаблоне четыре компонента. Абстракция : определяет интерфейс RefinedAbstraction : Реализация абстракции: Реализатор : определяет интерфейс для реализации ConcreteImplementor : Реализует интерфейс реализатора. Фрагмент кода: Gear gear = new ManualGear(); Vehicle vehicle = new Car(gear); vehicle.addGear(); gear = new AutoGear(); vehicle = new Car(gear); vehicle.addGear(); Похожие посты: Когда вы используете шаблон моста? Чем он отличается от шаблона адаптера? Ключевые отличия: от создание источника статья Адаптер заставляет вещи работать после того, как они спроектированы; Бридж заставляет их работать, прежде чем они. Мост спроектирован заранее, чтобы позволить абстракции и реализации варьироваться независимо. Адаптер модернизирован для совместной работы несвязанных классов.
8 голосов
/ 19 июня 2013

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

0 голосов
/ 19 мая 2017

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

      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
0 голосов
/ 18 июля 2016

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

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

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

...