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


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

6 88

6 ответов:

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

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

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

шаблон адаптера больше касается получения существующего кода для работы с новой системой или интерфейсом.

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

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

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

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

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

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

адаптер:

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

диаграммы UML: С dofactory статьи:

enter image description here

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

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

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

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

пример:

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

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. это возможно, потому что композиция была использована вместо наследования

EDIT: ( согласно предложению @quasoft)

У вас есть четыре компонента в этом узор.

  1. абстрагирование: Он определяет интерфейс

  2. RefinedAbstraction: он реализует абстракцию:

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

  4. ConcreteImplementor: он реализует интерфейс конструктора.

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

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

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

обзоры сообщение:

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

основные отличия: С sourcemaking статьи

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

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

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

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

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

      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