很久以前…
class MusicLibrary {
private Set collection ...
public Set getPopMusic() { ... }
public Set getRockMusic() { ... }
public Set getElectronicaMusic() { ... }
}
然后你意识到你希望能够通过其他类型过滤图书馆的馆藏.您可以继续添加新的getter方法.或者您可以使用访客.
interface Visitor {
visit(Set items);
}
interface MusicVisitor extends Visitor;
class MusicLibrary {
private Set collection ...
public void accept(MusicVisitor visitor) {
visitor.visit( this.collection );
}
}
class RockMusicVisitor implements MusicVisitor {
private final Set picks = ...
public visit(Set items) { ... }
public Set getRockMusic() { return this.picks; }
}
class AmbientMusicVisitor implements MusicVisitor {
private final Set picks = ...
public visit(Set items) { ... }
public Set getAmbientMusic() { return this.picks; }
}
您将数据与算法分开.您将算法卸载到访问者实现.您可以通过创建更多访问者来添加功能,而不是不断修改(和膨胀)包含数据的类.