Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Shablony_korporativnykh_prilozheniy_Fauler_M.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
3.82 Mб
Скачать

Преобразователь (Mapper)

Объект, устанавливающий взаимодействие между двумя независимыми объектами

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

Принцип действия

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

Зачастую преобразователь перемещает данные из одного слоя в другой. После активи­зации преобразователя понять принцип его работы совсем несложно. Самый непростой аспект использования преобразователя — это его запуск, поскольку преобразователь не может быть напрямую вызван одной из подсистем, которые он отображает друг на друга. Иногда управление отображением, а значит, и вызов преобразователя возлагают на неко­торую третью подсистему. Вместо этого преобразователь можно реализовать в виде типо­вого решения обозреватель (Observer) [20], выполняющего роль "наблюдателя" за одной из обслуживаемых систем. В этом случае преобразователь активизируется при перехвате событий, сгенерированных этой системой.

Принцип работы преобразователя зависит от природы отображаемых слоев. Наиболее распространенной разновидностью преобразователя является рассмотренный нами ра­нее преобразователь данных (Data Mapper), примеры использования которого можно найти в главе 10 этой книги.

Назначение

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

Таким образом, преобразователь необходимо использовать только тогда, когда ни од­на из отображаемых систем не должна зависеть от взаимодействия с другой системой. Это действительно важно только в том случае, когда структура взаимодействия особенно сложна и практически не связана с основным назначением каждой системы. Поэтому в корпоративных приложениях главной областью применения преобразователя является обслуживание взаимодействий с базой данных. Соответствующая разновидность преоб­разователя получила название преобразователя данных.

Концепция преобразователя имеет немало общего с типовым решением медиатор (Mediator) [20] в том плане, что оба они применяются для разделения независимых объ­ектов. Тем не менее между данными типовыми решениями есть принципиальное разли­чие. Объекты, использующие медиатор, знают о его наличии, даже если им неизвестно о существовании друг друга. В свою очередь, объекты, разделенные преобразователем, не знают о наличии последнего.

Супертип слоя (Layer Supertype)

Тип, выполняющий роль суперкласса для всех классов своего слоя

Довольно часто одни и те же методы дублируются во всех объектах слоя. Чтобы избе­жать повторений, все общее поведение можно вынести в супертип слоя.

Принцип действия

Концепция супертипа слоя, а следовательно, и само типовое решение крайне просты. Все, что от вас требуется, — это создать суперкласс для всех объектов слоя (например, класс DomainObject, являющийся суперклассом для всех объектов домена в модели предметной области (Domain Model). После этого в созданный суперкласс может быть вынесено все общее поведение наподобие сохранения и обработки полей идентификации (Identity Field). Точно так же все преобразователи данных (Data Mapper), образующие слой отображения, могут иметь общий суперкласс, работающий с супер­классом объектов домена.

Если в рассматриваемом слое приложения находятся объекты нескольких различных типов, может понадобиться создать несколько супертипов слоя.

Назначение

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

Пример: объект домена (Java)

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

class DomainObject...

private Long ID;

public Long getID() {

return ID;

}

public void setID(Long ID) {

Assert.notNull("Cannot set a null ID", ID);

this.ID = ID;

}

public DomainObject(Long ID) {

this.ID = ID;

}

public DomainObject() {

}

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