迭代器与访客设计模式和方法

时间:2014-02-21 11:47:10

标签: c# .net oop design-patterns

通过互联网上提供的设计模式的不同文章中的各种示例,我可以看到访问者模式与遍历某些数据结构相关联,通常是树或层次结构,我有点困惑,因为如果是这样我们可以也可以使用Iterator模式。

访客设计模式与迭代器设计模式有何不同?另外C#如何使用访问者设计模式实现(模拟)“Double Dispatch”?有一些代码插图的任何想法。

2 个答案:

答案 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中用于使用循环遍历集合。它是使用IEnumerableIEnumerator接口实现的。

您可以在MSDN上找到Iterator的示例代码。

我知道访问者是一种模式,用于您不想更改域对象但仍能在其上运行不同逻辑的情况。在.NET中,我只知道LINQ内部使用的System.Linq.Expressions.ExpressionVisitor。你不会使用访问者来枚举集合,这就是我要说的差异。