Что такое паттерн проектирования Proxy
1️⃣ Как кратко ответить
Паттерн проектирования Proxy — это структурный паттерн, который предоставляет объект-заместитель для управления доступом к другому объекту. Он используется для контроля доступа, кэширования, логирования и других задач, не изменяя поведение оригинального объекта.
2️⃣ Подробное объяснение темы
Паттерн проектирования Proxy (Заместитель) — это структурный паттерн, который позволяет создать объект, выполняющий функции посредника между клиентом и реальным объектом. Этот посредник может контролировать доступ к реальному объекту, добавлять дополнительную функциональность или оптимизировать работу системы.
Зачем нужен Proxy
- Контроль доступа: Proxy может ограничивать доступ к объекту, например, проверяя права пользователя.
- Кэширование: Proxy может хранить результаты операций, чтобы избежать повторных вычислений.
- Логирование: Proxy может записывать информацию о вызовах методов для последующего анализа.
- Удаленный доступ: Proxy может представлять объект, находящийся в другой среде выполнения, например, на удаленном сервере.
Как работает Proxy
Proxy реализует тот же интерфейс, что и реальный объект, и содержит ссылку на него. Когда клиент вызывает метод Proxy, он может выполнить дополнительные действия до или после вызова метода реального объекта.
Пример кода
Рассмотрим пример, где Proxy используется для кэширования результатов вычислений.
// Интерфейс, который реализуют как реальный объект, так и Proxy
public interface Calculator {
int calculate(int input);
}
- Calculator: Интерфейс, определяющий метод
calculate, который должны реализовать как реальный объект, так и Proxy.
// Реальный объект, который выполняет сложные вычисления
public class RealCalculator implements Calculator {
@Override
public int calculate(int input) {
// Имитация сложного вычисления
return input * input;
}
}
- RealCalculator: Реализация интерфейса
Calculator, выполняющая реальное вычисление. В данном случае это просто возведение числа в квадрат.
// Proxy, который кэширует результаты вычислений
import java.util.HashMap;
import java.util.Map;
public class CalculatorProxy implements Calculator {
private RealCalculator realCalculator = new RealCalculator();
private Map<Integer, Integer> cache = new HashMap<>();
@Override
public int calculate(int input) {
if (cache.containsKey(input)) {
// Возвращаем кэшированный результат, если он уже был вычислен
return cache.get(input);
} else {
// Вызываем реальный объект для вычисления результата
int result = realCalculator.calculate(input);
// Кэшируем результат
cache.put(input, result);
return result;
}
}
}
- CalculatorProxy: Реализация интерфейса
Calculator, которая кэширует результаты вычислений.realCalculator: Экземпляр реального объекта, который выполняет вычисления.cache: Хранит результаты предыдущих вычислений.- Метод
calculateсначала проверяет, есть ли результат в кэше. Если да, возвращает его. Если нет, вызывает метод реального объекта, кэширует результат и возвращает его.
Применение
Паттерн Proxy широко используется в различных областях программирования. Например, в сетевых приложениях для реализации удаленных вызовов методов (Remote Method Invocation, RMI), в системах безопасности для контроля доступа, в веб-приложениях для кэширования данных и в логировании для отслеживания вызовов методов. Proxy позволяет добавлять функциональность к объектам без изменения их кода, что делает его мощным инструментом для проектирования гибких и расширяемых систем.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться