Замісник (шаблон проектування)

Матеріал з Вікіпедії — вільної енциклопедії.

Перейти до: навігація, пошук

Шаблон Proxy (Заступник)  — Шаблон проектування. Надає об'єкт, контролюючий доступ, перехоплюючи всі виклики до нього.

Зміст

[ред.] Проблема

Необхідно управляти доступом до об'єкту, так щоб створювати громіздкі об'єкти «на вимогу».

[ред.] Вирішення

Створити сурогат громіздкого об'єкту. «Заступник» зберігає посилання, яке дозволяє заступникові звернутися до реального суб'єкта (об'єкт класу «Заступник» може звертатися до об'єкту класу «Суб'єкт», якщо інтерфейси «Реального Суб'єкта» і «Суб'єкта» однакові). Оскільки інтерфейс «Реального Суб'єкта» ідентичний інтерфейсу «Суб'єкта», так, що «Заступника» можна підставити замість «Реального Суб'єкта», контролює доступ до «Реального Суб'єкта», може відповідати за створення або видалення «Реального Суб'єкта». «Суб'єкт» визначає загальний для «Реального Суб'єкта» і «Заступника» інтерфейс, так, що «Заступник» може бути використаний скрізь, де очікується «Реальний Суб'єкт».


«Заступник» може мати і інші обов'язки, а саме:

  • видалений «Заступник» може відповідати за кодування запиту і його аргументів і відправку закодованого запиту реальному «Суб'єктові»
  • віртуальний «Заступник» може кешировать додаткову інформацію про реального «Суб'єкта», щоб відкласти його створення
  • захищаючий «Заступник» може перевіряти, чи має зухвалий об'єкт необхідні для виконання запиту має рацію.


[ред.] Приклад на C#

  class MainApp
  {
    static void Main()
    {
      // Create math proxy
      MathProxy p = new MathProxy();
 
      // Do the math
      Console.WriteLine("4 + 2 = " + p.Add(4, 2));
      Console.WriteLine("4 - 2 = " + p.Sub(4, 2));
      Console.WriteLine("4 * 2 = " + p.Mul(4, 2));
      Console.WriteLine("4 / 2 = " + p.Div(4, 2));
 
      // Wait for user
      Console.Read();
    }
  }
 
  // "Subject"
 
  public interface IMath
  {
    double Add(double x, double y);
    double Sub(double x, double y);
    double Mul(double x, double y);
    double Div(double x, double y);
  }
 
   // "RealSubject"
 
  class Math : IMath
  {
    public double Add(double x, double y){return x + y;}
    public double Sub(double x, double y){return x - y;}
    public double Mul(double x, double y){return x * y;}
    public double Div(double x, double y){return x / y;}
  }
 
  // "Proxy Object"
 
  class MathProxy : IMath
  {
    Math math;
 
    public MathProxy()
    {
      math = new Math();
    }
 
    public double Add(double x, double y)
    {
      return math.Add(x,y);
    }
 
    public double Sub(double x, double y)
    {
      return math.Sub(x,y);
    }
 
    public double Mul(double x, double y)
    {
      return math.Mul(x,y);
    }
 
    public double Div(double x, double y)
    {
      return math.Div(x,y);
    }
  }


[ред.] Посилання

Proxy Design Pattern

Особисті інструменти