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