访问者模式,主要目的是把不同 ElementNode 子类的处理都集中写到一个 Visitor 类里,好方便管理
//c++
class XVisitor : public Visitor
{
public:
void visit(ElementNode *en);
void visitA(A *a);
void visitB(B *b);
void visitC(C *c);
void visitD(D *d);
};
void XVisitor::visit(ElementNode *en)
{ en->accept(this); }
class A : public ElementNode
{
public:
void accept(Visitor *v);
}
void A::accept(Visitor *v)
{ v->visitA(this); }
int main() {
XVisitor v;
A en;
v.visit(&en);
}
ps,其实可以用多态把 visitor 的每个visitA(A *a)
方法写作visit(A *a)
来减少一点代码量,对于没有多态的动态语言比如 PHP、Python 等就是上面通用写法方式,当然脚本语言可以直接反射黑魔法我就不用了。
于是问题来了,当 ElementNode 子类 A、B、C、D 越来越多时, 这个 visitor 类也越来越庞大,我们应该怎么解决?