访问者模式是一种行为型设计模式,它允许在不修改元素类的情况下,为对象结构添加新的操作。这种模式在编译器实现中比较常见,但在日常开发中使用较少。
当面临以下情况时,可以考虑使用访问者模式:
访问者模式的UML图通常包含两个类层次结构:一个用于操作的对象,另一个用于定义操作的访问者。
以下是使用C#实现访问者模式的一个示例:
#region Visitor
public interface IVisitor
{
void Visit(Element element);
}
#endregion
#region Visitor Concrete
public class VisitorConcreteA : IVisitor
{
public void Visit(Element element)
{
Console.WriteLine("{0} Visited {1}", this.GetType().Name, element.GetType().Name);
}
}
public class VisitorConcreteB : IVisitor
{
public void Visit(Element element)
{
Console.WriteLine("{0} Visited {1}", this.GetType().Name, element.GetType().Name);
}
}
#endregion
#region Element
public interface IElement
{
void Accept(IVisitor visitor);
}
public abstract class Element : IElement
{
public void Accept(IVisitor visitor)
{
visitor.Visit(this);
}
}
#endregion
#region Concrete Element
public class ElementConcreteA : Element
{
// 实现需要的任何内容
}
public class ElementConcreteB : Element
{
// 实现需要的任何内容
}
#endregion
#region Object Structure
public class ObjectStructure
{
private List _elements;
public ObjectStructure()
{
_elements = new List();
}
public void AttachElement(Element element)
{
_elements.Add(element);
}
public void DetachElement(Element element)
{
_elements.Remove(element);
}
public void Accept(IVisitor visitor)
{
foreach (Element element in _elements)
{
element.Accept(visitor);
}
}
}
#endregion
在示例中,使用了一个内部列表来实现对象结构。可以根据需要使用任何对象结构来实现该模式。
// 构建结构
ObjectStructure structure = new ObjectStructure();
structure.AttachElement(new ElementConcreteA());
structure.AttachElement(new ElementConcreteB());
// 创建访问者对象
VisitorConcreteA visitorA = new VisitorConcreteA();
VisitorConcreteB visitorB = new VisitorConcreteB();
// 结构接受访问者
structure.Accept(visitorA);
structure.Accept(visitorB);
Console.Read();