通过互联网上提供的设计模式的不同文章中的各种示例,我可以看到访问者模式与遍历某些数据结构相关联,通常是树或层次结构,我有点困惑,因为如果是这样我们可以也可以使用Iterator模式。
访客设计模式与迭代器设计模式有何不同?另外C#如何使用访问者设计模式实现(模拟)“Double Dispatch”?有一些代码插图的任何想法。
答案 0 :(得分:14)
通过使用访问者模式,您可以将某些数据结构上执行的操作与特定结构分离 - 即您定义了一些不关心数据结构的算法适用于。它实际上是为了解决修改无法修改的类行为的问题。
Iterator 模式将数据结构的探索与特定结构分离。
您可以完美地结合两者:使用迭代器移动数据结构的每个项目,并将访问者传递给每个项目,以便外部负责人执行项目的某些操作。
.NET中的 IEnumerable
实现了Iterator模式。假设您有一个Item
类,其Visit
方法采用IVisitor
接口,访问者实现该接口,并从该接口调用一些方法来调用访问者操作。然后,您将使用迭代器访问集合中的每个项目:
IEnumerable<Item> itemCollection = new List<Item>(...);
IVisitor visitor = new VisitorImplementation();
foreach (Item item in itemCollection)
item.Visit(visitor);
关于你的第二个问题,你可能会发现这个很棒的MSDN articule on the Visitor pattern and double dispatch很有用。它提供了对访客模式的更好解释,同时也专注于该主题。
答案 1 :(得分:2)
Iterator在.NET中用于使用循环遍历集合。它是使用IEnumerable
和IEnumerator
接口实现的。
您可以在MSDN上找到Iterator的示例代码。
我知道访问者是一种模式,用于您不想更改域对象但仍能在其上运行不同逻辑的情况。在.NET中,我只知道LINQ内部使用的System.Linq.Expressions.ExpressionVisitor
。你不会使用访问者来枚举集合,这就是我要说的差异。