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

162

Реализация

Заместитель может не владеть информацией о типе реального объекта, который необходимо заместить. Для реализации такой возможности достаточно организовать класс Proxy так чтобы он мог работать субъектом только через его абстрактный интерфейс (абстрактный класс Subject), в таком случае класс Proxy сможет обращаться к любому конкретному классу, реализующему абстрактный интерфейс Subject, единообразно. Важно заметить, что если заместитель должен инстанцировать реальных субъектов (в случае с виртуальным заместителем, например), то знание конкретного класса является обязательным.

При реализации паттерна Proxy может возникнуть проблема при обращении к еще не инстанцированному экземпляру класса Subject. Она возможна в случае, когда заместитель должен работать со своими субъектами вне зависимости от реального места расположения экземпляров субъектов (на диске – персистентные, устойчивые экземпляры, в памяти – временные). В таком случае, нужно использовать при реализации такую форму идентификации, которая бы не зависела от адресного пространства. В примере из раздела «Пример кода» в качестве такого идентификатора используется имя файла.

Пример кода

Рассмотри пример реализации виртуального заместителя. В классе Graphic определен абстрактный интерфейс для графических объектов:

abstract class Graphic

{

public string fileName; abstract public void Draw(); abstract public void Load();

public Image PictureToShow { get; set; }

}

Класс Picture реализует интерфейс Graphic, позволяя работать с файлами картинок:

class Picture : Graphic

{

public Picture(string fileName)

{

this.fileName = fileName;

}

public override void Draw()

{

PictureToShow = Image.FromFile(fileName);

}

public override void Load()

{

throw new InvalidOperationException();

}

}

Класс PictureProxy представляет собой конкретную реализацию виртуального заместителя, которая имеет тот же интерфейс, что и класс Picture:

class PictureProxy : Graphic

{

Picture picture;

public PictureProxy(string fileName)

{

this.fileName = fileName;

163

PictureToShow = new Bitmap(Resources.startImg, 52, 62);

}

public override void Draw()

{

if (picture == null)

{

picture = new Picture(fileName);

}

picture.Draw();

}

public override void Load()

{

PictureList.listPictures[PictureList.listPictures.IndexOf(this)] = this.picture;

}

}

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

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

Известные применения паттерна в .Net

Microsoft.Build.Tasks.Deployment.ManifestUtilities.ProxyStub http://msdn.microsoft.com/ruru/library/microsoft.build.tasks.deployment.manifestutilities.proxystub(v=vs.110).aspx

System.Runtime.Remoting.Proxies.ProxyAttribute http://msdn.microsoft.com/enus/library/system.runtime.remoting.proxies.proxyattribute(v=vs.110).aspx

System.Web.Script.Services.ProxyGenerator http://msdn.microsoft.com/ruru/library/system.web.script.services.proxygenerator(v=vs.110).aspx

System.Web.UI.WebControls.WebParts.ProxyWebPart http://msdn.microsoft.com/ruru/library/system.web.ui.webcontrols.webparts.proxywebpart(v=vs.90).aspx

System.Net.Configuration.DefaultProxySection http://msdn.microsoft.com/enus/library/system.net.configuration.defaultproxysection(v=vs.110).aspx

System.Net.GlobalProxySelection http://msdn.microsoft.com/ruru/library/system.net.globalproxyselection(v=vs.110).aspx

System.Net.IWebProxy http://msdn.microsoft.com/ru-ru/library/system.net.iwebproxy(v=vs.118).aspx

System.Reflection.AssemblyNameProxy http://msdn.microsoft.com/ruru/library/system.reflection.assemblynameproxy(v=vs.110).aspx

System.Runtime.Remoting.Proxies.RealProxy http://msdn.microsoft.com/enus/library/system.runtime.remoting.proxies.realproxy(v=vs.110).aspx

System.Web.UI.Design.ScriptManagerProxyDesigner

164

http://msdn.microsoft.com/ruru/library/system.web.ui.design.scriptmanagerproxydesigner(v=vs.90).aspx

System.Runtime.Serialization.SurrogateSelector http://msdn.microsoft.com/enus/library/system.runtime.serialization.surrogateselector(v=vs.110).aspx

System.Runtime.Remoting.Messaging.RemotingSurrogateSelector http://msdn.microsoft.com/ruru/library/system.runtime.remoting.messaging.remotingsurrogateselector(v=vs.110).aspx

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