Проблемы шаблона Visitor

Опубликовал read-php в 11.02.2011 Категория: Выполнение задач и представление результатов в PHP

Шаблон Visitor — это еще один шаблон, объединяющий в себе простоту и функциональность. Но при его использовании следует помнить о некоторых моментах.

Хотя шаблон Visitor идеально приспособлен для использования с шаблоном Composite, на самом деле его можно применять с любым набором объектов. Так что вы можете использовать его. например, со списком объектов, где каждый объект сохраняет ссылку на его «братьев» (т.е. на элементы одного уровня на дереве).

Однако экспортируя операции, вы рискуете «скомпрометировать» инкапсуляцию, т.е. вам может понадобиться показать внутреннее содержание посещенных объектов, чтобы позволить посетителям сделать с ними что-то полезное. Например, в нашем первом примере с Visitor мы были вынуждены обеспечить дополнительный метод для интерфейса Unit, чтобы предоставить информацию для объектов TextDumpArmyVisitor. С этой дилеммой мы уже сталкивались в шаблоне Observer.

Поскольку итерация отделена от операций, которые выполняют объекты посетители, вы должны ослабить контроль в некоторой степени. Например, вы не можете легко создать метод visit (), который что-то делать и до, и после того, как выполняются итерации дочерних узлов. Один из способов решения — передать ответственность за выполнение итерации в объекты-посетители. Но проблема в том, что это может привести к дублированию кода обхода в каждом посетителе.

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

Комментариев нет

Добавить комментарий