V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zjsxwc
V2EX  ›  程序员

如何处理访问者模式随着被访问 ElementNode 类型越来越多导致 Visitor 类越写越大?

  •  
  •   zjsxwc ·
    zjsxwc · 2019-07-30 09:55:25 +08:00 · 612 次点击
    这是一个创建于 1748 天前的主题,其中的信息可能已经有所发展或是发生改变。

    访问者模式,主要目的是把不同 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 类也越来越庞大,我们应该怎么解决?

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1054 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 22:48 · PVG 06:48 · LAX 15:48 · JFK 18:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.