首先,您应该知道这些模式的用途。
迭代器模式用于按顺序访问聚合体而不暴露其底层表示。因此,您可以在迭代器后面隐藏列表、数组或类似聚合物。
访问者模式用于在不更改元素本身的实现的情况下对元素结构执行操作。
因此,您在两种不同的情况下使用这些模式,而不是作为彼此的替代品。
在访问者模式中,您在要访问的每个元素中实现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
{
public void Accept(IVisitor visitor)
{
visitor.Visit(this);
}
}
为了完成代码,这里需要一个Visitor,它可以在访问我的或其他Acceptor的实现时将内容写入控制台。
public class MyVisitorImplementation : IVisitor
{
public void Visit(MyAcceptorImplementation item)
{
Console.WriteLine("Mine");
}
public void Visit(AnotherAcceptorImplementation item)
{
Console.WriteLine("Another");
}
}
更多有用的示例和更好的解释,请查看
访问者模式和
迭代器模式。
编辑:以下是同时使用访问者和迭代器的示例。迭代器只是指如何遍历聚合对象的逻辑。如果使用分层结构,则更有意义。
public VisitorExample2()
{
MyVisitorImplementation visitor = new MyVisitorImplementation();
List<object> myListToHide = GetList();
ConcreteIterator i = new ConcreteIterator(myListToHide);
IAcceptor item = i.First();
while(item != null)
{
item.Accept(visitor);
item = i.Next();
}
}
IVisitable
,那么就写成IVisitable CurrentItem()
。 - justHelloWorld