一尘不染

带有示例的访客模式的目的

java

我对访问者模式及其用途感到非常困惑。我似乎无法真正想象使用此模式或其目的的好处。如果有人可以举例说明的话,那就太好了。


阅读 285

收藏
2020-09-08

共1个答案

一尘不染

很久以前…

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; }
}

您将数据与算法分开。您将算法卸载到访问者实现中。您可以通过创建 更多 访问者来添加功能,而不是不断修改(和膨胀)保存数据的类。

2020-09-08