Design patterns 对这位来访者的思考

Design patterns 对这位来访者的思考,design-patterns,Design Patterns,典型的访问者基本上是根据从accept(对象)开始的访问者类型来分派访问者 想象一个在集合界面上工作的访问者 enum Visiting { STOP CONTINUE; } Visitor { accept( Object ); Visiting visit( Object ); Visiting visit( Map ); Visiting visit( List ); Visiting visit( Set ); Visiting visi

典型的访问者基本上是根据从accept(对象)开始的访问者类型来分派访问者

想象一个在集合界面上工作的访问者

enum Visiting {
   STOP
   CONTINUE;
}

Visitor {
   accept( Object );
   Visiting visit( Object );
   Visiting visit( Map );
   Visiting visit( List );
   Visiting visit( Set );
   Visiting visit( Collection );
   Visiting visit( ArrayList).
}
典型访问者中的>ArrayList<只会调用visit(List)。调用visit(Object)->visit(Collection)->visit(List)->visit(ArrayList)有什么好处吗。如果有任何访问 返回访问。停止未调用链中的下一个

有什么可能的论据会使这成为一个糟糕的选择

  • (-)性能,而不是简单地根据类型调用一次访问整个链
  • (+)易于集中基于某些超级类型的常见操作,无需重复
如果任何访问返回访问,则停止该链中的下一个访问 ?

尝试责任链而不是访客。
您使用访问者的方式错误,请参阅:

您试图实现什么?访问者模式的要点是,子类实例根据自己的类型决定调用哪个
visit()
方法。因此,在本例中,如果ArrayList有一个
accept(Visitor)
方法(但它没有),它将调用
visit(ArrayList)
accept()
方法位于已访问对象中,而不是访问者中。