问题描述
我对访问者模式及其用途感到非常困惑.我似乎无法想象使用这种模式的好处或其目的.如果有人可以在可能的情况下举例说明,那就太好了.=)
提前致谢
推荐答案
曾几何时...
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; } }
您将数据与算法分开.您将算法卸载到访问者实现.您可以通过创建更多个访问者来添加功能,而不是不断修改(和膨胀)保存数据的类.
问题描述
I'm really confused about the visitor pattern and its uses. I can't really seem to visualize the benefits of using this pattern or its purpose. If someone could explain with examples if possible that would be great. =)
Thanks in advance
推荐答案
Once upon a time...
class MusicLibrary { private Set<Music> collection ... public Set<Music> getPopMusic() { ... } public Set<Music> getRockMusic() { ... } public Set<Music> getElectronicaMusic() { ... } }
Then you realize you'd like to be able to filter the library's collection by other genres. You could keep adding new getter methods. Or you could use Visitors.
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; } }
You separate the data from the algorithm. You offload the algorithm to visitor implementations. You add functionality by creating more visitors, instead of constantly modifying (and bloating) the class that holds the data.