I've been studying design patterns, and I've come across the Visitor Pattern. It's a really strange thing to me; it seems as if its only purpose is to prevent the original classes in the hierarchy from needing to change even when a new responsibility is added to them. This happens simply by delegating those responsibilities to an implementation of an abstract visitor class (or interface) and effectively double dispatching to call the operating function of the correct visitor passing in the correct dynamic type.
I've looked into various other questions discussing when and why to use the Visitor Pattern, and all I've come across is that in OOP, it is expected that your number of classes grow rather than the number of methods per class, which the Visitor Pattern specializes in.
However, is this true? This sounds like a gross oversimplification of OOP to me. For reference, this answer came from here
I also read another (loosely) related question here, the answers to which imply that you should only create more classes and separate responsibilities where it makes sense. Does it really make sense to organize your code such that a "responsibility" of a class is defined merely by a single operation, regardless of the type being operated on (i.e. a visitor is responsible for the implementation of the operation for every relevant type), or does it make much more sense to define a responsibility as a set of operations which can be done on a single type (delegate those responsibilities to the types themselves)?
If the goal is merely to reduce lines of code in each class, why is this a legitimate goal? Line count alone does not have any direct implications regarding encapsulation, modularity, code organization, or general good OOP practices, right?
Edit: I now understand that patterns do not exist to serve OOP, and I now understand that there are cases where the Visitor pattern is the best solution. That being said, does it, or does it not, promote less sensible class hierarchies when used alongside OOP?