gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 16:49:31 26 4
gpt4 key购买 nike

在你告诉我已经有类似问题之前,是的,我知道,我已经阅读了it .
但那里的问题集中在什么时候,我对为什么感兴趣。
我明白事情是如何运作的。经典的动物、狗、猫的例子总是很有魅力。
事情是这个代码

int main()
{
Cat c;
Sound theSound;
c.letsDo(&theSound);
}
对我来说似乎很不自然。为什么?
我的意思是,是的,这样我的 Dog 和 Cat 模型没有区别(我第一次在英语中使用这个词顺便说一句),因为真正的实现隐藏在 Sound 类下,但这不仅仅是一种压低代码的方法?多态性还不足以做这样的事情吗?
对我而言,不同之处在于,使用多态性您必须编辑每个类(但模型保持不变,对吗?)而您只需使用访问者设计模式编辑一个类。

最佳答案

访问者模式允许你做一些简单的依赖多态的事情:处理意外的用例。如果你正在编写一个库,这是一个重要的点。让我详细说明:

考虑一个使用访问者模式的经典示例,即对某些 abstract syntax 的节点的操作。树。要添加一些细节,比如说,您刚刚为 SQL 编写了一个解析器库,它接受字符串,解析它们,并为它在输入中找到的内容返回一个 AST。除非您可以预测您的客户端代码对于此类 AST 可能具有的所有潜在用例,否则您必须提供一种“通用”方式来执行 AST。提供类似 DOM 的访问器函数( getNodeTypegetParentNodegetPreviousNode )是一种方法。这里的问题是,这给您图书馆的客户带来了沉重的负担,因为他们需要自己进行调度。更重要的是,他们需要非常详细地了解每种可能的节点类型要遵循哪些指针:

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

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

关于design-patterns - 一个使用访问者设计模式的好理由?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3685608/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com