The iterator pattern shows us how to separate the internal structure of a data container from the code that operates on it. A visitor pattern is similar in topic, but applies not so much to composite data as to composite objects. It shows how to implement an algorithm/object separation, which allows us to add new operations to existing objects without modifying their structure. As such, it represents a good example of the Open/Closed principle in practice.
In classical object-oriented code, a part of code (an algorithm) would take an object, inspect its internal structure, and operate on its parts. If we use the visitor pattern, this approach is turned on its head. The algorithm merely passes a method to the object and kindly asks it to execute that method on its constituent parts.