首先,您应该知道这些模式的用途。
迭代器模式用于顺序访问聚合而不暴露其底层表示。因此,您可以在迭代器后面隐藏列表或数组或类似的聚合。
访问者模式用于对元素结构执行操作,而无需更改元素本身的实现。
因此,您可以在两种不同的情况下使用这些模式,而不是相互替代。
在访问者模式中,您在要访问的每个元素中实现接口 IAcceptor。因此,访问者模式不依赖于超类,而是依赖于接口
public interface IAcceptor
{
public void Accept(IVisitor visitor);
}
因此,如果您有一个对象列表,您可以对其进行迭代并访问实现 IAcceptor 的对象
public VisitorExample()
{
MyVisitorImplementation visitor = new MyVisitorImplementation();
List<object> objects = GetList();
foreach(IAcceptor item in objects)
item.Accept(visitor);
}
public interface IVisitor
{
public void Visit(MyAcceptorImplementation item);
public void Visit(AnotherAcceptorImplementation item);
}
public class MyAcceptorImplementation : IAcceptor
{
//Some Code ...
public void Accept(IVisitor visitor)
{
visitor.Visit(this);
}
}
要完成这里的代码,如果访问者访问我的或另一个接受器的实现,则将其写入控制台。
public class MyVisitorImplementation : IVisitor
{
public void Visit(MyAcceptorImplementation item)
{
Console.WriteLine("Mine");
}
public void Visit(AnotherAcceptorImplementation item)
{
Console.WriteLine("Another");
}
}
有关更多有用的示例和更好的解释,请查看访客模式 http://www.dofactory.com/net/visitor-design-pattern and 迭代器模式 http://www.dofactory.com/net/iterator-design-pattern
编辑:这里是一个同时使用访问者和迭代器的示例。迭代器只是如何在聚合中移动的逻辑。如果采用分层结构会更有意义。
public VisitorExample2()
{
MyVisitorImplementation visitor = new MyVisitorImplementation();
List<object> myListToHide = GetList();
//Here you hide that the aggregate is a List<object>
ConcreteIterator i = new ConcreteIterator(myListToHide);
IAcceptor item = i.First();
while(item != null)
{
item.Accept(visitor);
item = i.Next();
}
//... do something with the result
}