Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Design Patterns via C#.pdf
Скачиваний:
154
Добавлен:
17.03.2016
Размер:
13.25 Mб
Скачать

155

Паттерн Proxy

Название

Заместитель

Также известен как

Surrogate (Суррогат)

Классификация

По цели: структурный По применимости: к объектам

Частота использования

Выше средней - 1 2 3 4 5

Назначение

Паттерн Proxy - предоставляет объект-заместитель для контроля доступа к другому объекту.

Введение

Как видно из альтернативного названия паттерна Proxy, его еще называют Surrogate (Суррогат). А что такое суррогат в житейском смысле?

Суррогат - (от лат. surrogatus - поставленный взамен «вместо» другого) это предмет или продукт, заменяющий собой какой-либо другой предмет или продукт, с которым он (суррогат) имеет лишь некоторые общие свойства, но суррогат не обладает всеми качествами оригинального предмета или продукта, например, суррогатом зерен кофе - являются ячмень или желуди, суррогатом сахара – является сахарин. Также суррогатом часто называют различного рода подделки (фальсифицированные продукты), например, подделанный виски или водку, кроссовки abibas или батарейки Panosanic и др.

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

Действие разворачивается в 2057 году. Некий ученый Лайонел Кэнтop разработал нейрокомпьютерный интерфейс (систему для обмена информацией между мозгом человека и электронным устройством, например, компьютером), который позволяет человеку, силой нервных импульсов управлять роботом андроидом. При этом робот андроид внешне похож на человека оператора и ведёт себя полностью как человек. Настоящий же человек-оператор находящийся удаленно от своего робота суррогата — чувствует и переживает все ощущения, которые «воспринимает» его электронный двойник-суррогат через систему встроенных датчиков. В результате такого изобретения мир преобразился. Живые люди не выходят из своих домов, а вместо них по улицам ходят роботы-суррогаты. Главный герой фильма — агент ФБР Том Грир роль которого играет Брюс Уиллис, также, пользуется суррогатом, напоминающим по внешнему виду владельца в его молодые годы.

156

Мы не будем раскрывать весь сюжет кинофильма «Суррогаты», чтобы не испортить удовольствие от просмотра тем, кто намеревается посмотреть этот фильм. Рассмотрим еще только один интересующий нас момент из этого фильма.

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

Обратите внимание на связку «человек-оператор» и его «робот-суррогат» в кинофильме «Суррогаты». Суррогат в двустороннем порядке обменивается сигналами со своим оператором (принимая и передавая сигналы), при этом сам оператор оказывается защищен от агрессивной среды обитания, но в случае острой необходимости, оператор может занять место своего суррогата, что говорит о совпадении интерфейсов взаимодействия человека-оператора и робота-суррогата.

Из сказанного выше легко сформировать модель и реализовать ее программно.

class Program

 

 

 

{

 

 

 

static void Main()

 

interface IHuman

{

 

 

 

 

{

IHuman Bruce

= new Operator();

void Request();

IHuman surrogate

= new Surrogate(Bruce);

}

surrogate.Request();

 

}

 

 

 

}

 

 

 

class Operator :

IHuman

class Surrogate : IHuman

{

{

 

 

IHuman @operator;

public void Request()

 

{

 

public Surrogate(IHuman @operator)

Console.WriteLine("Operator");

{

}

 

 

this.@operator = @operator;

}

 

 

}

 

 

 

 

public void Request()

 

 

{

 

 

this.@operator.Request();

 

 

}

 

 

}

См. Пример к главе: \012_Proxy\004_Surrogates

157

Структура паттерна на языке UML

См. Пример к главе: \012_Proxy\001_Proxy

Структура паттерна на языке C#

class Program

 

{

 

static void Main()

abstract class Subject

{

{

Subject subject = new Proxy();

public abstract void Request();

subject.Request();

}

}

 

}

 

class RealSubject

: Subject

class Proxy : Subject

{

 

{

public override void Request()

RealSubject realSubject;

{

 

 

Console.WriteLine("RealSubject");

public override void Request()

}

 

{

}

 

if (realSubject == null)

 

 

realSubject = new RealSubject();

 

 

realSubject.Request();

 

 

}

 

 

}

Так может выглядеть диаграмма объектов при использовании паттерна Proxy:

См. Пример к главе: \012_Proxy\001_Proxy

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]