Skip to main content

У чому відмінність «Адаптера» від простого wrapper-класу?

Головна відмінність між Adapter і wrapper-класом (обгорткою) полягає в призначенні та рівні абстракції: усі адаптери - це обгортки, але не кожна обгортка є адаптером.


1. Мета

  • Adapter вирішує архітектурну задачу сумісності інтерфейсів: дозволяє об'єкту з «непідходящим» інтерфейсом працювати там, де очікується інший.
  • Wrapper просто додає функціональність навколо наявного об'єкта (наприклад, логування, валідацію, кешування), не змінюючи інтерфейс.

Приклад:

  • Adapter: перетворює playMP3() на play(String file): «перекладає» інтерфейс.
  • Wrapper: додає логування до play(String file): «розширює» поведінку.

2. Інтерфейс

  • Adapter зазвичай змінює інтерфейс: реалізує один (цільовий) інтерфейс і викликає методи іншого (адаптованого).
  • Wrapper зберігає той самий інтерфейс, просто обгортає виклики додатковою логікою.

Приклад (Adapter):

java
class MediaAdapter implements MediaPlayer { private OldPlayer player = new OldPlayer(); public void play(String file) { player.startPlayback(file); } }

Приклад (Wrapper):

java
class LoggingMediaPlayer implements MediaPlayer { private MediaPlayer wrapped; public void play(String file) { System.out.println("Start playing " + file); wrapped.play(file); } }

3. Контекст використання

КритерійAdapterWrapper
МетаСумісність інтерфейсівРозширення поведінки
Змінює інтерфейсТакНі
Приклад застосуванняІнтеграція старого і нового кодуДодавання логування, кешування
РівеньАрхітектурнийПоведінковий

4. Висновок

Adapter - це «перекладач інтерфейсів», що забезпечує сумісність. Wrapper - це «декоратор поведінки», що додає нові можливості без зміни контракту. Тобто Adapter потрібен, щоб з'єднати несумісне, а Wrapper, щоб підсилити вже сумісне.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.