Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

GrandM-Patterns_in_Java

.pdf
Скачиваний:
132
Добавлен:
14.03.2016
Размер:
9 Мб
Скачать
☆

1 26

• Глава 5. Парождающие шаблоны проектирования

 

Рассмотрим эти роли.и Т.Д. j

WidgetAlF, WidgetBIF Интерфейсы, выступаюшие в этой роли, соответст. вуют сервису или характеристике продукта. Классы, которые реализуют один из этих интерфейсов, работают с сервисом или характеристикой, которой соот. ветствует интерфейс.

Ввиду нехватки места здесь показаны только два таких интерфейса. Большая часть приложений с шаблоном Abstract Factory имеет более двух интерфейсовот­ подобного рода. Интерфейсов должно быть столько, сколько используется дельных характеристик и сервисовипроТ.д.укта.

ProductlWidgetA, Product2WidgetA Классы, выступающие в этой роли,

соответствуют конкретной характеристике определенного продукта. В общем, можно ссылаться на классы, играющие эти роли, как на конкретные элементы окна.

Client. Классы в роли C l ient используют конкретные классы элементов окна, чтобы запросить или получить сервис от того продукта, с которым работает клиент. Клиентские классы взаимодействуют с конкретными классами элемен­ тов окон только через интерфейс WidgetIF. Они не зависят от реальных кон­ кретных классов элементов окон, с которыми работаютдля.

FactoryIF. Интерфейсы в этой роли объявляют методы создания экземпляров конкретных классов элементов окон. Каждый такой метод возвращает экземп­ ляр класса, который реализует свой интерфейс Widge t I F. Классы, отвечающие за создание конкретных объектов элементов окон, реализуют интерфейс, вы­ ступающий в этой роли. и Т.Д.

ConcreteFactoryl,дляConcreteFactory2 Классы в этой роли реализуют интер­

фейс FactoryIF создания экземпляров конкретных классов элементов окон. Каждый класс, выступающий в этой роли, соответствует отдельному продукту,

с которым может работать класс Client. Каждый метод класса ConcreteFactory

создает конкретный элемент окна определенного вида. Однакодлявсе конкретнытем элементы окна, создаваемые этими методами, предназначены работы с продуктом, которому соответствует класс ConcreteFactory.

Клиентские классы, вызывающие эти методы, не должны иметь никакой непО­ средственной информации об этих конкретных классах-фабриках. Вместо этоro онидолжны обращаться к экземплярам этих классов через интерфейс Factorylf.

РЕАЛИЗАЦИЯ

Основной задачей, решаемой при реализации шаблона Abstract Factory, явлЯ- !

ется проблема написания механизма, который используется клиентскимJI

классами для создания и доступа к объектам FactoryIF. Самая простая ситуа­ ция возникает тогда, когда клиентские объекты должны работать только с од­ ним продуктом на протяжении всего периода функционирования программызэ­.

В этом случае некоторые классы обычно имеют статические переменные,

данные для класса ConcreteFactory, используемого на стадии выполненttl1

Abstгact Factory - 127

программы. Переменная может быть открытой, или ее значение может быть получено через открытый статический метод.

Если абстрактный объект-фабрика будет использовать информацию, предос­ тавляемую выдающим запрос клиентом, для выбора одного из нескольких кон­ кретных объектов-фабрик, то можно использовать шаблон Factory Method.

СЛЕДСТВИЯ

©Клиентские классы не зависят от конкретных классов элементов окон, ко­ торые они используют.

©Добавление (в отличие от написания) классов для работы с дополнительны­

ми продуктами осуществляется просто. Обычно на класс конкретного объекта-фабрики ссылка должна делаться только в одном месте. Кроме того, несложно заменить конкретный объект-фабрику, используемый для работы с определенным продуктом.

©Заставляя клиентские классы проходить через интерфейс FactoryIF с це­

лью создания конкретных объектов элементов окон, шаблон Abstract Factory гарантируетдля , что клиентские объекты используют соответствующий набор объектов работы с продуктом.

@) Главный недостаток шаблона Abstract Factory в том, что при взаимодейст­ вии с продуктом может понадобиться большая работа по написанию нового набора классов. Значительных усилий требует также расширение набора ха­ рактеристик, которые существующий набор классов способен реализовать. Если должен поддерживаться новый продукт, пишется полный набор кон­ кретных классов элементов окон с целью поддержкидляэтого продукта. Необ­ ходимо написать конкретный класс элемента окна каждого интерфейса

Widge tI F. Если имеется множество интерфейсов WidgetIF, то для под­

держки дополнительного продукта потребуется большая работа.

Добавление доступа к дополнительной характеристике взаимодействующих продуктов тоже может потребовать значительных усилий, если существует много поддерживаемых продуктов. При этом пишется новый интерфейс WidgetIF, соответствующий новой характеристике, и новый конкретный класс элемента окна, соответствующий каждому продукту.

€) Клиентские объекты могут потребовать, чтобы классы элементов управле­ ния окна бьuIИ организованы в виде иерархии, которая обслуживает потреб­

ности клиентских объектов. Шаблон Abstract Factory сам по себе не подхо­ дит для решения этой задачи, так как он требует организации конкретных классов элементов окон в виде иерархии классов, не зависящей от клиент­ ских объектов. Это препятствие может быть преодолено посредством объе­ динения шаблона Bridge с шаблоном Abstract Factory:

1 .

Создайте иерархию не зависящих от продуктов

классов элементов

 

окон, удовлетворяющих требованиям клиентских

классов. При этом

 

каждый не зависящий от продукта класс элемента окна делегирует

128

• Глава 5. Порождающие шаблоны проектирования

 

зависящую от продукта логику зависящему от продукта классу, кото­

ааует. а интерфейс WidgetI F.

2.Пакет j v wt содержит классы, реализующие использование такого

варианта. Классы, подобные Button и TextField, содержат логикуЭЛI, которая не зависит от используемой системы управления окнами. классы обеспечивают естественный внешний вид и стиль посредством делегирования операций системы управления окнами конкретным клас­

сам элементов окон , реализующим интерфейсы, определенные в пакете j ava . awt . peer.

ПРИМЕНЕНИЕ В JAVA API

Шаблон Abstract Factory используется в Java API с целью реализации класса j ava . awt . Tool k i t. Это класс абстрактной фабрики , применяемый для созда­ ния объектов, работающих с «родной.) системой управления окнами. Используе­ мый класс конкретной фабрики задается кодом инициализации, и единственный объект конкретной фабрики возвращается его методом getDe faultTool kit.

ПРИМЕР КОДА

Чтобы рассмотреть пример кода этого шаблона, вернемся к проблеме, описан­ ной в разделе «KoHTeKCTh. На рис. 5.8 представлена расширенная диаrpамма классов, в которой содержится шаблон Abstract Factory.

Экземпляр класса C l ient управляет процессом удаленной диагностики. После определения архитектуры машины он должен диагностировать ее. Он передает тип архитектуры методу createTool ki t объекта Too l kitFactory. Этот метод возвращает экземпляр класса, например, EmberToolkit1 или Enginol aTool kit, который реализует интерфейс Archi tectureTool ki t F для заданной архитек­ туры компьютера. Затем объект C lient может использовать объект Archi­ tectureToo lki t I F для создания объектов, которые моделируют CPU (Centra\ Processing Units, центральные процессорные устройства), MMU (Мето!)' Management Units, блоки управления памятью) и другие компоненты соответ­ ствующей архитектуры.

Приведем код, который реализует проект диагностики удаленного компьютера, изображенный на рис. 5.8. Абстрактные классы элементов окна имеют очевиД­ ную структуру.

Код для конкретного класса-фабрики, который создает экземпляры классоВ

для тестирования компьютеров, имеющих архитектуру Ember, выглядит сле­ дующим образом:

class EmberToolkit implernents ArchitectureToolkitIF{ public CPU createCPU () (

return new EmberCPU ( ) ;

АО тг ст ГОСlurу - " T

} / / createCPU ( )

public ммu createММ()U (

return пеи EmberМ М U ( );

// с rеаtеММU ( )

// class EmberFactory

Создает ДЛЯ него объекты ArchitectureToolkitIF

---.L

г- ToolkitFactory createToolkit(architecture) : ArchitectureToolkitIF

 

 

 

 

 

 

«interface»

 

 

 

ArchitectureToolkitIF

 

 

 

createCPU

 

 

 

createMMU

 

 

 

...

 

 

 

 

 

 

 

 

 

*

 

 

 

 

II

 

 

 

II

 

 

 

I

 

 

 

I

 

 

 

I

 

 

 

- I - - - - - - - - - - - - - - - - - - ,

 

I

 

I

 

I

 

I

 

I

 

I

 

I

 

I

 

I

 

I

 

EmberToolkit

 

1

II

createCPU

 

II

 

 

I

createMMU

 

 

EnginolaToolkit

...

1

 

 

createCPU

 

 

 

 

 

 

createMMU

 

...

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Использует

 

 

 

 

I

 

Client

1]

 

 

 

 

 

 

 

 

 

 

 

I

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Создает

'"

 

I

«interface»

I *

 

 

 

 

 

...

 

 

 

 

 

 

 

 

*

I

 

 

 

 

 

 

 

 

 

 

 

CPU

 

 

 

 

Использует

 

 

 

 

 

I- - - - - - - - IL - - - - - - - 1

 

 

 

 

 

 

 

 

 

 

 

 

 

I

 

 

 

I

 

 

 

 

 

 

 

 

EmberCPU

I

I EnginoIlaCPU

I

 

ет

 

 

 

Созда]

 

 

 

i *

 

 

*

 

 

 

 

 

 

 

......

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Создает......

 

 

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

. . .

1

 

 

 

«interface» L

 

Исполь)ует

 

 

 

 

I

 

 

 

 

*

...

 

 

"'Создает

 

 

MMU

J

 

 

 

 

 

 

 

 

*

 

 

 

 

 

 

 

- - - - - - - -IL -- - - - - - 1

 

 

 

 

I

 

 

 

 

 

I

 

 

 

*

I

 

 

 

 

 

I

 

 

 

EnginolaMMU I

I

EmberMMU I

 

 

Создает

 

 

i *

Рис. 5.8. Классы диагностики вместе с абстрактной фабрикой

130 • Глава 5. Порождающие шаблоны проектирования

Код для интерфейса фабрики:

pub1ic interface ArchitectureToo1kitIF pub1ic abstract ммСРОu createCPO () pub1ic abstract createММ()U ;

// Abs t ractFactory

вэтой реализации шаблона Abstract Factory для создания объектов Archi ­ tectureToo l ki t I F используется шаблон Factory Method. В нижеприведенном

листинге класс-фабрика отвечает за создание объектов ArchitectureTool ­ kitIF .

pub1ic с1азз Too1kitFactory

/* *

* Единственный экземпляр этого класса .

* /

=private static Too1kitFactory mylnstance new Too1kitFactory () ;

/ / Символические имена для идентификации архитектур компьютеров .

pub1ic fina1

static

int ENGIHOLA

=

900 ;

pub1ic fina1

static

int EМВER

=

901 ;

/ / . . .

pub1ic static Too1kitFactory getlnstance () { return mylnstance ;

/ / ge tInstance ( )

/* *

* Возвращает вновь созданный объект, который реализует

интерфейс .

*ArchitectureToolkitIF для данной архитектуры компьютера .

*/

pub1ic

ArchitectureToo1kitIF createToo1kit (int architecture) { switch (architecture) {

case ENGINOLA:

return new Engino1aToo1kit () ;

case EМВER:

return new EmberToolkit ( ) ;

 

Abstroct Foctory • 131

} / / switch

= Integer . toString (arehiteeture) ;

String errМsg

throw new IllegalArgumentExeeption (errMsg) ;

// createToo l ki t ( int )

// c lass Toolki tFactory

Клиентские классы обычно создают объекты конкретных элементов управле­ ния окна, используя для этой цели код, который выглядит примерно так:

publie elass Client (

publie void doIt ()

ToolkitFaetory= rnyFaetory;

rnyFaetory ToolkitFaetory. getInstanee () ; ArehiteetureToolkitIF= af ;

сриaf ериrnyFaetory= . ereateToolkit (ToolkitFaetory . EМВER) ; af . ereateCPU ( ) ;

// doI t

// class Cl ient

ШАБЛОНЫ ПРОЕКТИРОВАНИЯ,

СВЯЗАННЫЕ С ШАБЛОНОМ ABSTRACT FACTORY

Factory Method. В последнем примере абстрактный класс-фабрика использует рикушаблон Factory Method для принятия решения, какой конкретный объект-фаб­

передать клиентскому классу.

Singleton. Конкретные классы-фабрики обычно реализуются как классы

Singleton.

Этот шаблон ранее был описан в работе [GoF95].

СИНОПСИС .3Щ1.а<>а'll

Шаблон Builder позволяет объекту клиента создавать сложный объект, дJ1Я него только тип и содержимое. Клиент избавлен от информации о построения объекта.

КОНТЕКСТ

Рассмотрим написание программы шлюза электронной почты. Программа поих­

лучает сообшения электронной почты в формате MIME1• Она отправляет

вдругом формате, соответствуюшем другому виду системы электронной почты.

Эта проблема хорошо решается с помошью шаблона Builder. Очень просто соз]

дать программу, используюшую объект, который занимается синтаксическимВQ

анализом сообщений в формате MIME. КаЖдое анализируемое сообщение

время синтаксического анализа образует пару вместе с объектом-строителем

используемым синтаксическим анализатором дJ1я создания сообщения в HOBO

формате. Как только синтаксический анализатор распознает какой-либо заro

ловок и тело сообщения, он вызывает соответствующий метод объекта-строи';

теля, с которым работает.

j

 

На рис. 5.9 изображена диаграмма классов, описывающая такую структуру.

Класс Mes sageManager отвечает за сбор сообщений электронной почты в фо .

мате MIME и активизацию их передачи. Сообщения, которыми он непосред

венно управляет, являются экземплярами класса MIMEMsg.

Экземпляры класса MIMEMsg инкапсулируют сообщения электронной поч

в формате MIME. Если объект Mes sageManager хочет передать сообщениI

в формате, отличном от MIME, то он должен заново создать сообщение в нуж!

ном формате. Содержание нового сообщения должно быть таким же, как и col

держание сообщения в МIМЕ-формате, или настолько близким, насколько пOJij

 

 

зволяет новый формат.

I

Класс MIMEParser представляет собой подкласс класса MessageParser, KOТOJ

рый может выполнять синтаксический анализ сообщений электронной почт.

в формате MIME и передавать их содержание объекту-строителю.

1

 

 

 

..

 

 

 

j

I MIME

это аббревиа1)'ра словосочетания Multipurpose Intemet Mail Extensions

целевы_

 

о стандарт, которому подчин

е раСШИРСI IИЯ интеРl lетпочты), определяющег

 

ются почти все сообщения электронной почты Иllтернета. Описание M I M E МОЖJl

найти по адресу http://mgrang.homc.mindspring.com/mime.html.

(MIIO .

 

 

MessageManager 1 .

 

 

 

 

Управляет

 

 

0...J1

MIMEMgg

д

 

т

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

*

 

 

 

 

 

r

1

отправитель

I

1

 

 

 

Подвергается синтаксическому ...

 

 

 

 

 

 

 

 

 

 

разбора

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0

. .

 

пре

 

ме

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

синтаксическоrо

 

 

... Отправляет

 

 

 

 

 

 

раэбору

 

 

 

 

 

 

1

синтаксический

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

анализатор

 

 

0

 

*

 

«interface»

 

 

 

 

 

 

 

MIMEParser

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

..

 

 

OutboundMessageIF

 

 

 

 

 

 

parse(msg:MIMEMessage)

 

 

 

 

 

 

 

 

 

 

 

 

получатель

 

 

send()

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

 

 

 

 

 

 

 

Направляет ...

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

о..*

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

II

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

I

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

I.- _ _ _ _ _ _ - - - - - . J - - - - - - -I1

 

 

 

 

 

 

Message8ui/der

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

I

 

 

 

 

 

 

I

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

II

 

 

 

 

getInstance(to:String):MessageBuilder

 

 

PROFSMsg

 

 

 

 

 

 

 

r

 

I

 

 

II

 

 

 

 

 

 

 

 

 

 

 

I

 

 

 

 

to(:String)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

I

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

r

 

III

 

I

 

 

from(:Stгing)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

oгganization(:Stгing)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

MAPIMsg

 

 

p/ainText(:Stгing)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

...

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

jpeglmage(:Image).

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

. .

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Соэдает

 

 

getOutboundMsg()

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

I

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

.....

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1 I1

 

I

 

 

 

 

 

 

 

 

 

 

 

 

 

 

.....Соэдает

 

 

 

 

 

 

MAPIBuilder

 

 

 

1 I1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

PROFSBuilder

 

 

 

 

 

 

 

 

Рис. 5.9.

 

Пример класса-строителя

 

 

 

 

 

 

 

 

 

 

 

MessageBui lder - это абстрактный класс-строитель. Он определяет методы,

соответствующие различным полям заголовков и телам, которые поддержива­

ются стандартом MIME. Класс MessageBuilder объявляет абстрактные методы,

которые соответствуют обязательным полям заголовков и наиболее распро­

страненным типам сообщения. Он делает эти методы абстрактными, так как

ВСе конкретные подклассы класса MessageBui lder должны определять эти ме­ тои ды. Однако некоторые необязательные поля заголовков (например, organization)

специфические форматы сообщения (например, Image/ Jpeg) могут не под­

держиваться всеми форматами сообщений, поэтому класс Mes s ageBui lder

Предоставляет «бездействующие» реализации таких методов.

Класс Mess ageBu i lde r определяет также статический метод get lnstance,

которому объект MIMEParser передает адрес назначения анализируемого сооб­

Щения. По этому адресу метод get lns tance определяет формат сообщения,

134 • Глава 5. Порождающие шаблоны проектирования

необходимый ДЛЯ нового сообщения. Он возвращает экземпляр подкласса класса MessageBui l der, соответствующий формату нового сообщения, в объ­ ект MIMEParser.

МAPIBuilder и PROFSBuilder - это конкретные классы-строители для созда­ ния МAPI- и РRОFS-сообщений соответственно.

Классы-строители создают объекты продуктов, которые реализуют интерфейс OutboundMe s sage I F. Этот интерфейс определяет метод send, предназначен­ ный для отправки сообщений электронной почты по нужному адресу.

На рис. 5. 1О представлена диаграмма взаимодействия, описывающая совмест­ ную работу этих классов.

 

 

 

l:receive(msg:MIMEMsg)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

I

:MessageManager

I

 

 

 

 

 

 

 

 

 

 

 

 

 

I

 

 

 

 

 

I

 

OutboundMessagelF

1

1.2: sendO

 

 

 

 

 

 

 

 

 

1

 

 

I

 

 

 

 

 

 

 

1.1:outMsg :- parse(msg:MIMEMsg)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1.1.2: to(:String)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1.1.3: from(:String)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1.1.4: plainText(:String)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1.1.5:jpegImage(:Image)

 

 

 

 

 

 

 

 

 

 

 

 

I

builder:MAPIBuiLder I

1.1.6: outMsg :- getOutboundMsg()

 

I

:MIMEParser

I

 

I

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1'.'.""";"''',. ",и."..",(to"tЛ••)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

....-

...L.. --,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

I

MessageBuiLder

I

 

Рис. 5.10. Взаимодействие в шаблоне Builder

Опишем изображенную на рис. 5. 1 0 ситуацию.

1.Объект Mes s ageManager получает сообщение электронной почты.

1.1. Объект MessageManager вызьшает метод parse класса MlМEParser.

Он возвращает объект OutboundMessageIF, который инкапсу­

лирует новое сообщение в нужном формате.

1.1.1. Объект MIMEParser вызывает метод get lnstance клас­ са Mes sageBui l der, передавая ему адрес назначения электронной почты. Анализируя адрес, метод выбирает

конкретный подкласс класса Mes sageBui lder И создает его экземпляр.

 

Builder - 135

1.1.2.

Объект MIMEParser передает адрес назначения элек­

 

тронной почты методу to объекта MessageBuilder.

1.1.3.

Объект MIMEParser передает исходящий адрес элек­

 

тронной почты методу from объекта Mes sageBu i lder.

1.1.4.

Объект MIMEParser передает содержимое сообщения

 

электронной почты методу plai nText объекта Mes -

 

sageBui lder.

1.1.5.

Объект MIMEParser передает jреg-изображение, при­

 

соединенное к сообщению электронной почты, методу

 

j peglmage объекта MessageBuilder.

1. 1.6.

Объект MIMEParser вызывает метод getOutboundМsg

 

объекта MessageBui lder ДЛЯ завершения обработки

 

старого и считывания нового сообщения.

1.2.Объект MessageManager вызывает метод send интерфейса Out­ boundMessageIF. Он отправляет сообшение и завершает его об­ работку сообщения.

МОТИВЫ

©Программа должна иметь возможность создавать многочисленные внешние представления одних и тех же данных.

©Классы, содержащие в себе данные, не должны зависеть от какого-либо внешнего представления этихданных и от классов, участвующих в их созда­ нии. Если классы, инкапсулирующие в себе данные, не зависят от внешних представлений данных, то изменения классов, отвечающих за внешнее представление этих данных, не потребуют изменения классов, отвечающих за их содержимое.

©Классы, отвечающие за создание внешних представлений данных, не зави­

сят от классов, инкапсулирующих их в себе. Их экземIUIЯРЫ могут работать

с любым, предоставляющим содержание, объектом, ничего о нем не зная.

РЕШЕНИЕ

На рис. 5.1 1 представлена диаграмма классов, показывающая участников шаб­

Лона Builder.

Опишем роли, которые играют эти классы и интерфейсы в шаблоне Builder.

Product. Класс в этой роли определяет тип представления данных. Все классы

Product должны реализовывать интерфейс Product I F таким образом, чтобы

другие классы могли ссылаться на объекты класса Product через интерфейс,

ничего не зная о классе объекта.

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