Заместитель (Proxy) — различия между версиями

Материал из Вики ИТ мехмата ЮФУ
Перейти к: навигация, поиск
(Диаграмма классов)
(Пример)
Строка 29: Строка 29:
 
*  
 
*  
  
=== Пример ===
+
=== Код ===
 
<source lang="Csharp">
 
<source lang="Csharp">
 +
class MainApp
 +
{
 +
    static void Main()
 +
    {
 +
        Proxy proxy = new Proxy();
 +
        proxy.Request();
 +
        Console.ReadKey();
 +
    }
 +
}
 +
 +
abstract class Subject
 +
{
 +
    public abstract void Request();
 +
}
 +
 +
class RealSubject : Subject
 +
{
 +
    public override void Request()
 +
    {
 +
        Console.WriteLine("Called RealSubject.Request()");
 +
    }
 +
}
 +
 +
class Proxy : Subject
 +
{
 +
    private RealSubject realSubject;
 +
 +
    public override void Request()
 +
    {
 +
        if (realSubject == null)
 +
        {
 +
            realSubject = new RealSubject();
 +
        }
 +
 +
        realSubject.Request();
 +
    }
 +
}
 
</source>
 
</source>
  

Версия 12:04, 8 августа 2014

К основной странице курса

Другое название

Суррогат (Surrogate)

Назначение

Заместитель ведет себя точно так же как и основной объект, выполняя при необходимости его инстанцирование.

Описание

В некоторых ситуациях расходы на создание и инициализацию объекта можно отложить до тех пор пока он действительно понадобится. Особенно заметен выигрыш - для тяжеловесных объектов, которые разумно создавать "по требованию".

В этом случае вместо самого объекта инстанцируется его Заместитель, а когда с объектом становится необходимо работать, инстанцируется сам объект.Например, в текстовом документе сбольшим количеством тяжеловесных изображений нет необходимости при открытии документа открывать и отображать все изображения. Необходимость в отображении изображения возникает лишь при переходе к области документа, в которой это изображение расположено.

Заместитель следует интерфейсу основного объекта, хранит ссылку на него и инстанцирует его по требованию.

Использование

Заместитель используется в следующих ситуациях.

  • Удаленный заместитель предоставляет локального представителя вместо объекта, находящегося в другом адресном пространстве.
  • Виртуальный заместитель создает "тяжелые" объекты по требованию.
  • Защищающий заместитель ограничивает права доступа к объекту.
  • Умная ссылка позволяет выполнить дополнительные действия при доступе к объекту - например, загрузить объект в память при первом доступе к нему или заблокировать объект при обращении к нему.

Реализация

Диаграмма классов

ProxyCommon.png

Участники

Код

class MainApp
{
    static void Main()
    {
        Proxy proxy = new Proxy();
        proxy.Request();
        Console.ReadKey();
    }
}

abstract class Subject
{
    public abstract void Request();
}

class RealSubject : Subject
{
    public override void Request()
    {
        Console.WriteLine("Called RealSubject.Request()");
    }
}

class Proxy : Subject
{
    private RealSubject realSubject;

    public override void Request()
    {
        if (realSubject == null)
        {
            realSubject = new RealSubject();
        }

        realSubject.Request();
    }
}

Достоинства и недостатки

Варианты