У чому відмінність «Адаптера» від простого 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. Контекст використання
| Критерій | Adapter | Wrapper |
|---|---|---|
| Мета | Сумісність інтерфейсів | Розширення поведінки |
| Змінює інтерфейс | Так | Ні |
| Приклад застосування | Інтеграція старого і нового коду | Додавання логування, кешування |
| Рівень | Архітектурний | Поведінковий |
4. Висновок
Adapter - це «перекладач інтерфейсів», що забезпечує сумісність. Wrapper - це «декоратор поведінки», що додає нові можливості без зміни контракту. Тобто Adapter потрібен, щоб з'єднати несумісне, а Wrapper, щоб підсилити вже сумісне.
Коротка відповідь
Для співбесідиPremium
Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.