Объясните различия между паттернами адаптер, декоратор и прокси, их назначения и области применения.
Answer from AI
sobes.tech AI
Паттерны адаптер, декоратор и прокси решают разные задачи, хотя все они работают с объектами и интерфейсами.
-
Адаптер (Adapter) — преобразует интерфейс одного класса в интерфейс, ожидаемый клиентом. Используется, когда нужно интегрировать несовместимые интерфейсы.
-
Декоратор (Decorator) — динамически добавляет объектам новые обязанности, оборачивая их без изменения исходного класса. Позволяет расширять функциональность гибко.
-
Прокси (Proxy) — предоставляет суррогат или заместителя для другого объекта, контролируя доступ к нему. Часто используется для ленивой инициализации, контроля доступа или логирования.
Пример:
// Адаптер
interface Target {
void request();
}
class Adaptee {
void specificRequest() { /*...*/ }
}
class Adapter implements Target {
private Adaptee adaptee = new Adaptee();
public void request() {
adaptee.specificRequest();
}
}
// Декоратор
interface Component {
void operation();
}
class ConcreteComponent implements Component {
public void operation() { /* базовая реализация */ }
}
class Decorator implements Component {
protected Component component;
public Decorator(Component c) { this.component = c; }
public void operation() {
component.operation();
// дополнительное поведение
}
}
// Прокси
class Proxy implements Subject {
private RealSubject realSubject;
public void request() {
if (realSubject == null) {
realSubject = new RealSubject();
}
realSubject.request();
}
}
Таким образом, адаптер меняет интерфейс, декоратор расширяет поведение, а прокси контролирует доступ к объекту.