Навчання шаблонам проектування: Розуміння шаблону адаптера для забезпечення сумісності

Шаблон "Адаптер" є структурним шаблоном проєктування, який дозволяє об'єктам з несумісними інтерфейсами працювати разом безперешкодно. Він виступає в ролі моста, що дає змогу компонентам, які зазвичай не можуть взаємодіяти, спілкуватися між собою.

У цій статті ми розглянемо шаблон "Адаптер", використовуючи поширений і зрозумілий приклад розеток і вилок. Ви дізнаєтесь його визначення, мету, реальні приклади застосування та як реалізувати його в TypeScript.

Зміст

  1. Визначення шаблону "Адаптер"
  2. Сценарій: розуміння проблеми
  3. Реальні проєкти, що використовують шаблон "Адаптер"

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

Leave a Reply

Your email address will not be published. Required fields are marked *