我对访问者模式及其用途感到非常困惑。我似乎无法真正想象使用此模式或其目的的好处。如果有人可以举例说明的话,那就太好了。
很久以前…
class MusicLibrary { private Set<Music> collection ... public Set<Music> getPopMusic() { ... } public Set<Music> getRockMusic() { ... } public Set<Music> getElectronicaMusic() { ... } }
然后,您意识到您希望能够按其他流派过滤图书馆的藏书。您可以继续添加新的getter方法。或者您可以使用访客。
interface Visitor<T> { visit(Set<T> items); } interface MusicVisitor extends Visitor<Music>; class MusicLibrary { private Set<Music> collection ... public void accept(MusicVisitor visitor) { visitor.visit( this.collection ); } } class RockMusicVisitor implements MusicVisitor { private final Set<Music> picks = ... public visit(Set<Music> items) { ... } public Set<Music> getRockMusic() { return this.picks; } } class AmbientMusicVisitor implements MusicVisitor { private final Set<Music> picks = ... public visit(Set<Music> items) { ... } public Set<Music> getAmbientMusic() { return this.picks; } }
您将数据与算法分开。您将算法卸载到访问者实现中。您可以通过创建 更多 访问者来添加功能,而不是不断修改(和膨胀)保存数据的类。