Шаблон "Адаптер" є структурним шаблоном проєктування, який дозволяє об'єктам з несумісними інтерфейсами працювати разом безперешкодно. Він виступає в ролі моста, що дає змогу компонентам, які зазвичай не можуть взаємодіяти, спілкуватися між собою.
У цій статті ми розглянемо шаблон "Адаптер", використовуючи поширений і зрозумілий приклад розеток і вилок. Ви дізнаєтесь його визначення, мету, реальні приклади застосування та як реалізувати його в TypeScript.
Зміст
- Визначення шаблону "Адаптер"
- Сценарій: розуміння проблеми
- Реальні проєкти, що використовують шаблон "Адаптер"
1. Визначення шаблону "Адаптер"
Шаблон "Адаптер" дозволяє класам з несумісними інтерфейсами співпрацювати, вводячи проміжний об'єкт — адаптер, який перетворює один інтерфейс в інший.
Цей шаблон зручний, коли ви хочете використовувати клас, який не відповідає інтерфейсу, що вимагає ваш застосунок.
2. Сценарій: розуміння проблеми
Уявіть, що ви подорожуєте з США до Європи. Ваші пристрої мають вилка, призначена для американської розетки, але європейські розетки мають інший дизайн. Без адаптера ви не зможете використовувати свої пристрої.
Адаптер виступає в ролі посередника, перетворюючи інтерфейс вилки так, щоб він був сумісний з розеткою.
Аналогічно, в програмному забезпеченні адаптер усуває невідповідність між несумісними інтерфейсами, дозволяючи системам взаємодіяти без зусиль.
Реалізація в TypeScript
Ось як можна реалізувати Шаблон Адаптера в TypeScript, використовуючи аналогію з розетками та вилками:
Крок 1: Оголосіть інтерфейси
interface IPlug {
getHeads: number;
getIsHeadsRounded: boolean;
}
interface ISocket {
getHoles: number;
getIsHolesRounded: boolean;
plugIn(plug: IPlug): boolean;
}
Крок 2: Оголосіть клас розетки (цільовий клас)
class EuropeanSocket implements ISocket {
private holes: number = 2;
private isHolesRounded: boolean = true;
public get getHoles(): number {
return this.holes;
}
public get getIsHolesRounded(): boolean {
return this.isHolesRounded;
}
public plugIn(plug: IPlug): boolean {
if (
plug.getHeads === this.holes &&
plug.getIsHeadsRounded === this.isHolesRounded
)
console.log("Plug entered with success");
else console.log("Plug incompatible with the socket");
return (
plug.getHeads === this.holes &&
plug.getIsHeadsRounded === this.isHolesRounded
);
}
}
Крок 3: Оголосіть клас вилки (адаптований клас)
class AmericanPlug implements IPlug {
private heads: number = 2;
private isHeadsRounded: boolean = false;
public get getHeads(): number {
return this.heads;
}
public get getIsHeadsRounded(): boolean {
return this.isHeadsRounded;
}
}
Крок 4: Оголосіть клас Адаптера
class SocketAdapter implements IPlug {
private americanPlug: AmericanPlug;
constructor(americanPlug: AmericanPlug) {
this.americanPlug = americanPlug;
}
public get getHeads(): number {
return 2;
}
public get getIsHeadsRounded(): boolean {
return true;
}
}
Крок 5: Використовуйте адаптер в клієнтському коді
const americanPlug = new AmericanPlug();
const europeanSocket = new EuropeanSocket();
console.log('Enter the plug without adapter:');
europeanSocket.plugIn(americanPlug);
console.log('Enter the plug with the adapter:');
const adapter = new SocketAdapter(americanPlug);
europeanSocket.plugIn(adapter);
Вивід:
Enter the plug without adapter:
Plug incompatible with the socket
Enter the plug with the adapter:
Plug entered with success
3. Реальні проекти, що використовують Шаблон Адаптера
1.
Інтеграція з третім боку: Підключення сторонніх API до додатка, який використовує інший формат.
2. Інтеграція з застарілим кодом: Забезпечення безшовної роботи нових систем з застарілими кодовими базами.
3. Кросплатформенна сумісність: Дозволяє системам, розробленим для однієї платформи, працювати на іншій з мінімальними змінами.
Шаблон Адаптера демонструє, як програмне проектування може запозичити концепції з реальних проблем, пропонуючи елегантні рішення для викликів сумісності. Поділіться в коментарях, як ви використовували цей шаблон у своїх проектах!
У наступній статті з нашої серії Вивчення шаблонів проєктування ми розглянемо Шаблон Моста (Bridge Pattern). Залишайтеся з нами!
Перекладено з: Learn Design Patterns: Understanding the Adapter Pattern for Compatibility