访问者模式是一种行为设计模式,它允许为对象结构添加新的操作,而不需要修改对象结构本身。这种模式在编译器实现中非常常见,但在日常开发中使用较少。
当遇到以下情况时,可以考虑使用访问者模式:
#region 访问者接口
public interface IVisitor
{
void Visit(Element element);
}
#endregion
#region 具体访问者
public class VisitorConcreteA : IVisitor
{
public void Visit(Element element)
{
Console.WriteLine($"{this.GetType().Name} Visited {element.GetType().Name}");
}
}
public class VisitorConcreteB : IVisitor
{
public void Visit(Element element)
{
Console.WriteLine($"{this.GetType().Name} Visited {element.GetType().Name}");
}
}
#endregion
#region 元素接口
public interface IElement
{
void Accept(IVisitor visitor);
}
public abstract class Element : IElement
{
public void Accept(IVisitor visitor)
{
visitor.Visit(this);
}
}
#endregion
#region 具体元素
public class ElementConcreteA : Element
{
// 实现具体逻辑
}
public class ElementConcreteB : Element
{
// 实现具体逻辑
}
#endregion
#region 对象结构
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();