Призначення Bridge і Adapter відрізняється, і нам потрібні обидва шаблони окремо.
Шаблон мосту:
- Це структурна закономірність
- Абстракція та реалізація не пов'язані під час компіляції
- Абстракція та реалізація - обидва можуть змінюватись без впливу на клієнта
- Використовує склад над спадщиною.
Використовуйте шаблон мосту, коли:
- Ви хочете прив’язати впровадження часу,
- У вас є розповсюдження класів в результаті сполученого інтерфейсу та численних реалізацій,
- Ви хочете поділитися реалізацією між кількома об'єктами,
- Потрібно зіставити ортогональні ієрархії класів.
@ Відповідь Джона Сонмеса чітко показує ефективність мостового шаблону в зменшенні ієрархії класів.
Ви можете посилатися на посилання нижче на документацію, щоб отримати кращу інформацію про модель моста на прикладі коду
Шаблон адаптера :
- Це дозволяє двом непов'язаним інтерфейсам працювати разом через різні об'єкти, можливо, граючи однакову роль.
- Це змінює оригінальний інтерфейс.
Основні відмінності:
- Адаптер змушує роботу працювати після їх розробки; Міст змушує їх працювати до того, як вони є.
- Міст розроблений вперед, щоб абстракція та реалізація залежали незалежно . Адаптер переобладнаний для того, щоб зв'язати непов’язані класи разом.
- Завдання: Адаптер дозволяє двом незв’язаним інтерфейсам працювати разом. Bridge дозволяє абстракції та реалізації змінюватися незалежно.
Питання SE щодо діаграми UML та робочого коду:
Різниця між схемою моста та схемою адаптера
Корисні статті:
стаття шаблон мосту джерело
стаття шаблону адаптера для створення джерела
journaldev міст шаблон статті
Редагувати:
Приклад реального світу мосту (відповідно до пропозиції meta.stackoverflow.com), включений приклад сайту документації в цій публікації, оскільки документація буде встановлена на сонце)
Модель мосту відв'язує абстрагування від реалізації, щоб обидва могли змінюватись незалежно. Це було досягнуто композицією, а не спадщиною.
Модель UML з Вікіпедії:
У вас є чотири компоненти в цій схемі.
Abstraction
: Він визначає інтерфейс
RefinedAbstraction
: Він реалізує абстракцію:
Implementor
: Він визначає інтерфейс для реалізації
ConcreteImplementor
: Він реалізує інтерфейс Implementor.
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
Використовуйте регістри для мостів :
- Абстракція та реалізація можуть змінюватись незалежно один від одного, і вони не пов'язані під час компіляції
- Карта ортогональних ієрархій - одна для абстрагування та одна для реалізації .