Цель Мост и Адаптер различна, и нам нужны оба шаблона по отдельности.
Схема моста:
- Это структурный паттерн
- Абстракция и реализация не связаны во время компиляции
- Абстракция и реализация - оба могут меняться без влияния на клиента
- Использует композицию вместо наследования.
Использовать шаблон Мост, когда:
- Требуется привязка реализации во время выполнения,
- У вас есть множество классов, возникающих в результате связанного интерфейса и многочисленных реализаций,
- Вы хотите поделиться реализацией среди нескольких объектов,
- Вам необходимо отобразить ортогональные иерархии классов.
@ Ответ Джона Сонмеза наглядно показывает эффективность паттерна моста в сокращении иерархии классов.
Вы можете обратиться к ссылке на документацию ниже, чтобы лучше понять шаблон моста с примером кода
Схема адаптера :
- Он позволяет двум несвязанным интерфейсам работать вместе через различные объекты, возможно, играя одну и ту же роль.
- Изменяет оригинальный интерфейс.
Ключевые отличия:
- Адаптер заставляет вещи работать после того, как они спроектированы; Мост заставляет их работать раньше, чем они.
- Мост спроектирован заранее, чтобы позволить абстракции и реализации варьироваться независимо . Адаптер переоборудован для совместной работы несвязанных классов.
- Назначение: Адаптер позволяет двум несвязанным интерфейсам работать вместе. Мост позволяет абстракции и реализации варьироваться независимо.
Связанный вопрос SE с UML-диаграммой и рабочим кодом:
Разница между шаблоном моста и шаблоном адаптера
Полезные статьи:
исходный мост шаблон артикула
исходный адаптер шаблон артикула
Мост журналов образец статьи
EDIT:
Пример реального использования Bridge Pattern (в соответствии с предложением meta.stackoverflow.com, включенным примером сайта документации в этом посте, так как документация собирается заходить)
Шаблон моста отделяет абстракцию от реализации, так что оба могут варьироваться независимо. Это было достигнуто с помощью композиции, а не наследования.
Шаблон моста UML из Википедии:
В этом шаблоне четыре компонента.
Abstraction
: определяет интерфейс
RefinedAbstraction
: Реализует абстракцию:
Implementor
: определяет интерфейс для реализации
ConcreteImplementor
: Реализует интерфейс реализатора.
The crux of Bridge pattern :
Две ортогональные иерархии классов с использованием композиции (без наследования). Иерархия абстракций и иерархия реализации могут варьироваться независимо. Реализация никогда не относится к абстракции. Абстракция содержит интерфейс реализации в качестве члена (через композицию). Эта композиция уменьшает еще один уровень иерархии наследования.
Реальное слово Вариант использования:
Разрешить различным транспортным средствам иметь как версии с ручной, так и автоматической системой передач.
Пример кода:
/* Implementor interface*/
interface Gear{
void handleGear();
}
/* Concrete Implementor - 1 */
class ManualGear implements Gear{
public void handleGear(){
System.out.println("Manual gear");
}
}
/* Concrete Implementor - 2 */
class AutoGear implements Gear{
public void handleGear(){
System.out.println("Auto gear");
}
}
/* Abstraction (abstract class) */
abstract class Vehicle {
Gear gear;
public Vehicle(Gear gear){
this.gear = gear;
}
abstract void addGear();
}
/* RefinedAbstraction - 1*/
class Car extends Vehicle{
public Car(Gear gear){
super(gear);
// initialize various other Car components to make the car
}
public void addGear(){
System.out.print("Car handles ");
gear.handleGear();
}
}
/* RefinedAbstraction - 2 */
class Truck extends Vehicle{
public Truck(Gear gear){
super(gear);
// initialize various other Truck components to make the car
}
public void addGear(){
System.out.print("Truck handles " );
gear.handleGear();
}
}
/* Client program */
public class BridgeDemo {
public static void main(String args[]){
Gear gear = new ManualGear();
Vehicle vehicle = new Car(gear);
vehicle.addGear();
gear = new AutoGear();
vehicle = new Car(gear);
vehicle.addGear();
gear = new ManualGear();
vehicle = new Truck(gear);
vehicle.addGear();
gear = new AutoGear();
vehicle = new Truck(gear);
vehicle.addGear();
}
}
выход:
Car handles Manual gear
Car handles Auto gear
Truck handles Manual gear
Truck handles Auto gear
Объяснение:
Vehicle
- это абстракция.
Car
и Truck
- две конкретные реализации Vehicle
.
Vehicle
определяет абстрактный метод: addGear()
.
Gear
является интерфейсом разработчика
ManualGear
и AutoGear
- две реализации Gear
Vehicle
содержит интерфейс implementor
вместо реализации интерфейса. Compositon
интерфейса реализатора является сутью этого шаблона: Это позволяет абстракции и реализации варьироваться независимо.
Car
и Truck
определяют реализацию (переопределенную абстракцию) для абстракции: addGear()
: содержит Gear
- либо Manual
, либо Auto
Варианты использования для схемы моста :
- Абстракция и Реализация может изменяться независимо друг от друга, и они не связаны во время компиляции
- Карта ортогональных иерархий - одна для Абстракция и одна для Реализация .