Proxy и Facade — это структурные паттерны проектирования, которые решают различные задачи при организации архитектуры приложений.
Proxy выступает суррогатом или «заместителем» объекта. Его задача — контролировать доступ, кэшировать, реализовывать ленивую загрузку, регулировать безопасность или распределять запросы (например, сетевой прокси, security proxy). Proxy реализует тот же контракт (интерфейс), что и реальный объект.
Пример на Java:
public interface Service { void operation(); } public class RealService implements Service { public void operation() { // ... } } public class ProxyService implements Service { private RealService realService = new RealService(); public void operation() { // access check realService.operation(); } }
Facade — это паттерн, который скрывает сложность подсистемы, предоставляя единый упрощённый интерфейс. Facade не занимается контролем доступа или дополняющей логикой, он только агрегирует вызовы.
Пример на Java:
public class PaymentFacade { private CardService card; private SmsService sms; public void pay() { card.check(); card.charge(); sms.notify(); } }
Когда применять:
Ключевые особенности:
Разрешается ли Facade паттерн добавлять функциональность сверх исходных классов подсистемы?
Нет, Facade только агрегирует и упрощает вызовы, новый функционал реализуется другими паттернами либо в новых сервисах.
Обязательно ли Proxy реализовывать через наследование от целевого объекта?
Нет, Proxy реализует интерфейс цели, но часто используется композиция (инкапсуляция настоящего объекта), а не наследование.
Можно ли использовать Facade для управления доступом или лога ошибок?
Для этого лучше использовать Proxy. Facade не предназначен для встроенной поддержки кэширования, логирования или проверки прав.