Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Applied Java™ Patterns - Stephen Stelting, Olav Maassen.pdf
Скачиваний:
202
Добавлен:
24.05.2014
Размер:
2.84 Mб
Скачать

for a Task object calls the method visitTask on the Visitor. If the Visitor is a CostProjectVisitor, the

visitTask method computes the cost associated with the Task.

This design offers substantial benefits. Most importantly, it is very easy to add new operations to this design. To add a computation for time, you only have to write a new TimeProjectVisitor class with all of the necessary methods to compute project time. The code for the project objects remains unchanged, since it already supports calling the generic methods defined in the ProjectVisitor.

Better still, the Visitor provides a place to centralize state. For the CostProjectVisitor, you can store the intermediate result in the Visitor itself while you compute the cost estimate. The centralized estimation code also makes it easier to adjust the basic calculations. Using the Visitor pattern lets you easily add features such as an additional weighting factor, making it easy to calculate a project discounts or, preferably, a markup.

Applicability

Use the Visitor pattern when the following conditions are met:

A system contains a group of related classes.

Several non-trivial operations need to be carried out on some or all of the related classes.

The operations must be performed differently for different classes.

Description

The Visitor pattern involves taking related operations out of a group of classes and placing them together in a single class. The motivation is code maintainability—in some situations, it simply becomes too complicated to maintain operations in the classes themselves. Visitor is useful for these situations, since it provides a very generic framework to support operations on a group of classes.

The pattern requires that all classes having operations performed on them, or Elements, support some form of accept method, called when the Visitor should perform an operation on the Element. The argument for that accept method is an instance of Visitor. Each Element implementation implements the accept method to call the visit method in the Visitor for its own class type. Every Visitor implementation implements the specific visit method for Element subtype.

Products that might benefit from use of the Visitor pattern include those that use complex rules for configuration. As a practical example, consider a vehicle as a purchasable product. There are dozens of decisions to make when buying a car, and many of the choices can have an impact on things like price, financing or insurance rates.

Implementation

The Visitor class diagram is shown in Figure 2.15.

Figure 2.15. Visitor class diagram

87