The visitor pattern is a good choice if the operations are going to be extended often. It is, however, not optimally if the elements are going to be extended often. At least as long as the visitor needs functionality of the concrete elements that is not contained in a common ancestor of the elements.
In case the operations implemented via the visitor tend to be more stable than the element classes, it would be better to define the operations as abstract methods in an ancestor or interface implemented by all concrete elements than using the visitor pattern.