代码之家  ›  专栏  ›  技术社区  ›  dierre

使用访问者设计模式的一个很好的理由?

  •  5
  • dierre  · 技术社区  · 14 年前

    在你告诉我已经有一个类似的问题之前,是的,我知道,我读过 it . 什么时候 ,我对 为什么?

    我知道事情是怎么运作的。经典 动物、狗、猫

    问题是这个密码

    int main()
    {
        Cat c;
        Sound theSound;
        c.letsDo(&theSound);
    }
    

    我觉得很不自然。为什么?

    我是说,是的,这样我就有了我的狗和猫模型 (我第一次在英语中使用这个词顺便说一句)因为真正的实现隐藏在Sound类下,但这不只是一种减轻代码负担的方法吗?多态性还不够做这样的事情吗?

    对我来说,不同之处在于多态性必须编辑每个类(但是模型保持不变,对吗?)而您只需使用visitor设计模式编辑一个类。

    4 回复  |  直到 4 年前
        1
  •  8
  •   Dirk    14 年前

    访问者模式允许您做一些事情,而仅仅依靠多态性是不行的:处理未预料到的用例。如果你正在写一个库,这是一个重要的一点。让我详细说明一下:

    考虑使用visitor模式的一个经典示例,即对某些 abstract syntax getNodeType , getParentNode getPreviousNode )是一种方式。这里的问题是,这给您的库的客户机带来了沉重的负担,因为他们需要自己进行调度。更重要的是,他们需要非常详细地了解每种可能的节点类型应该遵循哪些指针:

    void 
    walk_tree(AstNode* node) 
    {
        switch( node->getNodeType() ) {
        case SELECT_NODE:
            for( AstNode* child = node->getFirstChild(); child; child = child->getNextNode() ) {
                 walk_tree(child);
            }
            break;
        ...
        }
    }
    

    访问者模式将这个负担从客户机转移到库中。

        2
  •  3
  •   munificent    14 年前

    东西 在你不拥有的库中定义,你需要扩展它。比如:

    // In base lib:
    interface ISomething {
        void DoSomething();
    }
    
    class Something1 : ISomething {
        // ...
    }
    
    class Something2 : ISomething {
        // ...
    }
    

    多态性允许您定义可以对其执行操作的新对象:

    // In your lib:
    class MySomething : ISomething {
    }
    

    MySomething 好像它已经定义了它。怎么了 你要做的就是添加新的 操作 DoSomething 我们唯一能做的就是 ISomething . 访问者模式解决了这个问题。

    缺点是使用visitor模式 成本 expression problem .

    visitor模式是一个很酷的模式,但是除了实现编译器之外,我从来没有发现对它的需要。

        3
  •  2
  •   Richard Gomes    11 年前

    访问者模式非常有用。

    使用它至少有三大原因:

    1. 对多个数据结构应用相同的计算,而不更改实现计算的代码。

    请看一看 an article I've written about this

    干杯

        4
  •  1
  •   Tony Ennis    14 年前

    当我有一个对象树并且需要以多种方式打印内容时,我使用了visitor模式。逗号、XML等等。我没有为每个输出格式添加一个新的print方法,而是使用visitor模式并创建了CommaSepVisitor、XMLVisitor和HTMLVisitor类。树代码从来没有改变,因为我添加了更多的访问者类型,所以我从来没有引入错误。来访者本身很容易写作。