Инструменты пользователя

Инструменты сайта


pattern_proxy

Назад

Паттерн Proxy предоставляет суррогатный объект, управляющий доступом к другому объекту.

Proxy берет на себя управления доступом чтобы избавить клиента от лишних взаимодействий. Существует несколько разновидностей Proxy и все они обычно тем или иным образом связаны с тем как именно организуется управления доступами.

Варианты использования Proxy:

  • Удаленный заместитель управляет доступом удаленного объекта (например используя RMI)
  • Виртуальный заместитель обеспечивает создание реального «Субъекта» только тогда, когда он действительно понадобится. Так же может кэшировать часть информации о реальном «Субъекте», чтобы отложить его создание.
  • Защитный заместитель контролирует доступ к ресурсу в соответствии с системой привилегий.
  • Фильтрующий заместитель управляет доступом к группам сетевых ресурсов, защищая их от недобросовестных клиентов.
  • Умная ссылка обеспечивает выполнение дополнительных действий при обращении к объекту (Например, изменение счетчика ссылок)
  • Кеширующий заместитель обеспечивает временное хранение результатов высокозатратных операций.
  • Синхронизирующий заместитель предоставляет безопасный доступ к объекту из нескольких программных потоков.
  • Упрощающий заместитель скрывает сложность и управляет доступом к сложному набору классов.(похоже на фасад только еще управляет доступом).

Пример использования удаленного Proxy

Пример Виртуального заместителя

public interface IMath
{
    public int Add(int x, int y);
    public int Sub(int x, int y);
    public int Mul(int x, int y);
    public int Div(int x, int y);    
}
 
class Math implements IMath
{
 
    public int Add(int x, int y)
    {
        return x+y;
    }
 
    public int Sub(int x, int y)
    {
         return x-y;
    }
 
    public int Mul(int x, int y)
    {
         return x*y;
    }
 
    public int Div(int x, int y)
    {
        return x/y;
    }   
}
class MathProxy implements IMath
{
    protected IMath math = null;
    public int Add(int x, int y)
    {
        return x+y;
    }
 
    public int Sub(int x, int y)
    {
        return x-y;
    }
 
    public int Mul(int x, int y)
    {
        if(math == null)
        {
            math = new Math();
        }
        return math.Mul(x, y);
    }
 
    public int Div(int x, int y)
    {
        if(math == null)
        {
            math = new Math();
        }
        return math.Div(x, y);
    }
}
public class Main
{
    public static void main(String[] args)
    {
       IMath math = new MathProxy();
       System.out.println(math.Add(10, 20));
       System.out.println(math.Mul(10, 20)); 
    }
}