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

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до: навігація, пошук

Шаблон 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);
    }
  }


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

Література[ред.ред. код]

Алан Шаллоуей, Джеймс Р. Тротт Шаблоны проектирования. Новый подход к объектно-ориентированному анализу и проектированию = Design Patterns Explained: A New Perspective on Object-Oriented Design. — М.: «Вильямс», 2002. — 288 с. — ISBN 0-201-71594-5