Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2 семестр ЗО / Лаб.работы / ЛабРаб № 10!.doc
Скачиваний:
56
Добавлен:
06.02.2016
Размер:
697.86 Кб
Скачать

Шаблон Creator

Решение.Назначить классу В обязанность создавать экземпляры класса А, если выполняется одно из следующих условий:

  • Класс В агрегирует,(aggregate) объекты А.

  • Класс В содержит(contains) объекты А.

  • Класс В записывает(records) экземпляры объектов А.

  • Класс В активно использует(closelyuses) объекты А.

  • Класс В обладает данными инициализации(hastheinitializingdata), кото­рые будут передаваться объектам А при их создании (т.е. при создании объ­ектов А класс В является экспертом).

  • Класс В – создатель(creator) объектов А.

Если выполняется несколько из этих условий, то лучше использовать класс В, агрегирующийилисодержащийкласс А.

Проблема.Кто должен отвечать за создание нового экземпляра некоторого класса?

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

Пример.Кто в POS-системе должен отвечать за создание нового экземпляра объектаSalesLineltem?

В соответствии с шаблоном Creator, необходимо найти класс, агрегирующий, содержащий и т.д. экземпляры объектов SalesLineItem. Рассмотрим фрагмент модели предметной области, представленной на рис. 2.6:

Рисунок 2.6 – Фрагмент модели предметной области

Поскольку объект Saleсодержит (фактически – агрегирует) несколько объектовSalesLineItem, согласно шаблонуCreator, он является хорошим кан­дидатом для выполнения обязанности, связанной с созданием экземпляров объ­ектовSalesLineItem.

Такой подход приводит к необходимости разработки взаимодействия объек­тов, показанного на следующей диаграмме (рис. 2.7):

Рисунок 2.7 – Создание экземпляра объекта SalesLineltem

При таком распределении обязанностей требуется, чтобы в объекте Saleбыл определен методmakeLineItem.

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

Преимущества

Поддерживается шаблон LowCoupling(рассматриваемый ниже), способствующий снижению затрат на сопровождение и обеспечивающий возможность повторного использования созданных компонентов в дальнейшем применение шаблонаCreatorне повышает степени связанности, посколькусозданный(created) класс, как правило, оказывается видимым для класса создателя посредством имеющихся ассоциаций.

Связанные шаблоны и принципы:

  • LowCoupling.

  • Factory.

Шаблон Low Coupling

Решение.Распределить обязанности таким образом, чтобы степень связанно­сти оставалась низкой.

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

Степень связанности(coupling) – это мера, определяющая насколько же­стко один элемент связан с другими элементами, либо каким количеством дан­ных о других элементах он обладает. Элемент с низкой степенью связанности (или слабым связыванием) зависит от не очень большого числа других элемен­тов. Выражение "очень много" зависит от контекста, однако необходимо провес­ти его оценку.

Класс с высокой степенью связанности (или жестко связанный) зависит от множества других классов. Однако наличие таких классов нежелательно, по­скольку оно приводит к возникновению следующих проблем:

  • Изменения в связанных классах приводят к локальным изменениям в дан­ном классе.

  • Затрудняется понимание каждого класса в отдельности.

  • Усложняется повторное использование, поскольку для этого требуется до­полнительный анализ классов, с которыми связан данный класс.

Пример.Рассмотрим следующий фрагмент диаграммы классов для приложе­ния ТТ.

Предположим, что необходимо создать экземпляр класса Paymentи связать его с объектомSale.

Какой класс должен отвечать за выполнение этой операции?

По­скольку в реальной предметной области регистрация объекта Paymentвыполняется объектомRegister, в соответствии с шаблономCreator, объектRegisterявляется хорошим кандидатом для создания объектаPayment. Затем экземпляр объектаReg­isterдолжен передать сообщениеaddPaymentобъектуSale, указав в качестве па­раметра новый объектPayment. Приведенные рассуждения отражены на фрагменте диаграммы взаимодействий, представленной на рис. 2.8:

Рисунок 2.8 – Новый экземпляр объекта Paymentсозда­ется с помощью объектаRegister

Такое распределение обязанностей предполагает, что класс Registerобла­дает знаниями о данных классаPayment(т.е. связывается с ним).

Обратите внимание на обозначения, принятые в языке UML. Экземпляру объектаPaymentприсвоено явное имяр, чтобы его можно было использовать в качестве параметра сообщения 2.

Альтернативный способ создания объекта Paymentи его связывания с объ­ектомSaleпоказан на рис. 2.9:

Рисунок 2.9 – Новый экземпляр объекта Paymentсозда­ется с помощью объектаSale

Какой из методов проектирования, основанный на распределении обязанно­стей, обеспечивает более низкую степень связывания?В обоих случаях предпо­лагается, что в конечном итоге объектуSaleдолжно быть известно о существо­вании объектаPayment. При использовании первого способа, когда объектPay­mentсоздается с помощью объектаRegister, между этими двумя объектами добавляется новая связь, тогда как второй способ степень связывания объектов не усиливает. С точки зрения числа связей между объектами, более предпочти­тельным является второй способ, поскольку в этом случае обеспечивается низкая степень связывания. Приведенная иллюстрация является примером того, как при использовании двух различных шаблонов –LowCouplingиCreator– можно прийти к двум различным решениям.

На практике уровень связывания не рассматривается отдельно от других принципов, сформулированных в шаблонах Expert и High Cohesion. Тем не менее в шаблоне Low Coupling описан один из факторов, с использованием ко­торого можно значительно улучшить весь проект в целом.

Преимущества:

  • Изменения компонентов мало сказываются на других объектах.

  • Принципы работы и функции компонентов можно понять, не изучая другие объекты.

  • Удобство повторного использования.

Связанные шаблоны:

  • ProtectedVariations(Защищенные вариации).

Соседние файлы в папке Лаб.работы