Back to questions
Junior — Middle
58
Можете объяснить отличия между паттернами Adapter и Decorator в контексте проектирования программного обеспечения?
Companies where asked
IBS
Answer from AI
sobes.tech AI
Паттерны Adapter и Decorator часто путают, но у них разные цели и способы применения:
-
Adapter (Адаптер) — служит для преобразования интерфейса одного класса в интерфейс, который ожидает клиент. Используется, когда нужно заставить несовместимые интерфейсы работать вместе. Адаптер оборачивает объект и переводит вызовы клиента в вызовы адаптируемого объекта.
-
Decorator (Декоратор) — предназначен для динамического добавления новых обязанностей объекту без изменения его интерфейса. Декоратор оборачивает объект и расширяет или изменяет его поведение.
Ключевые отличия:
- Adapter меняет интерфейс объекта, чтобы он стал совместим с клиентом.
- Decorator сохраняет интерфейс объекта, но добавляет новое поведение.
Пример на Java:
// Adapter: адаптируем интерфейс
interface Target {
void request();
}
class Adaptee {
void specificRequest() {
System.out.println("Специфический запрос");
}
}
class Adapter implements Target {
private Adaptee adaptee;
Adapter(Adaptee a) { this.adaptee = a; }
public void request() {
adaptee.specificRequest();
}
}
// Decorator: добавляем поведение
interface Component {
void operation();
}
class ConcreteComponent implements Component {
public void operation() {
System.out.println("Основная операция");
}
}
class Decorator implements Component {
protected Component component;
Decorator(Component c) { this.component = c; }
public void operation() {
component.operation();
}
}
class ConcreteDecorator extends Decorator {
ConcreteDecorator(Component c) { super(c); }
public void operation() {
super.operation();
System.out.println("Дополнительное поведение");
}
}