Разница между картиной моста и картиной переходники
в чем разница между шаблонами моста и адаптера?
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. Разработчики всегда получали заглушку, сужали ее и называли "псевдо-удаленно". Это часто вызывало проблемы с производительностью (ЭСП. когда действительно позвонили по проводу). Опытные разработчики будут использовать шаблон фасада, чтобы обеспечить очень грубый интерфейс для клиента. Этот фасад, в свою очередь, будет выполнять несколько вызовов различных более мелкозернистых методов. В целом, это значительно сократило количество требуемых вызовов методов и повысило производительность.
адаптер:
- это структурная модель
- полезно работать с двумя несовместимыми интерфейсами
диаграммы UML: С dofactory статьи:
цель : определяет доменный интерфейс, который использует клиент.
адаптер : адаптируется адаптация интерфейса к целевому интерфейсу.
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); } }
мост:
- это структурная модель
- он отделяет абстракцию от ее реализации, и оба могут варьироваться независимо
- это возможно, потому что композиция была использована вместо наследования
EDIT: ( согласно предложению @quasoft)
У вас есть четыре компонента в этом узор.
абстрагирование: Он определяет интерфейс
RefinedAbstraction: он реализует абстракцию:
конструктор: Он определяет интерфейс для реализации
ConcreteImplementor: он реализует интерфейс конструктора.
фрагмент кода:
Gear gear = new ManualGear(); Vehicle vehicle = new Car(gear); vehicle.addGear(); gear = new AutoGear(); vehicle = new Car(gear); vehicle.addGear();
обзоры сообщение:
когда вы используете шаблон мост? Чем он отличается от шаблона адаптера?
основные отличия: С sourcemaking статьи
- адаптер заставляет вещи работать после того, как они разработаны; мост заставляет их работать, прежде чем они есть.
- мост разработан заранее, чтобы абстракция и реализация изменялись независимо. Адаптер модифицирован, чтобы заставить работать несвязанные классы вместе.
предположим, что у вас есть абстрактный класс 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