应用场景
访问者模式即表示一个作用于某对象结构中的各元素的操作,它使我们可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
自我理解是 比如说数据结构固定的,把他的一直在改变的行为给抽出来写成观察者类.
参与者:
Vistor: 抽象访问者。为该对象结构中的ConcreteElement的每一个类声明的一个操作。
ConcreteVisitor: 具体访问者。实现Visitor申明的每一个操作,每一个操作实现算法的一部分。
Element: 抽象元素。定义一个Accept操作,它以一个访问者为参数。
ConcreteElement: 具体元素 。实现Accept操作。
ObjectStructure: 对象结构。能够枚举它的元素,可以提供一个高层的接口来允许访问者访问它的元素。
//例:人类为男人和女人
遇到同一状态,两人的处理结果是不同的
public abstract class Person
{//先将人类抽象出来
public abstract void Accept(IVisitor visitor);//将状态传当参数传入
}
public override void Accept(IVisitor visitor)
{//GetManConclusion 把具体的对象传入
visitor.GetManConclusion(this); //双重分派
}
女人类,……
//下面是抽象状态类
public interface IVisitor
{
//把状态全抽象
void GetManConclusion(Person man );//男人和女人同样结果下不同的状态
void GetWomanConclusion(Person woman);
}
class Succeed : IVisitor
{
public void GetManConclusion(Person man )
{
Console.WriteLine(@"{0}{1}时,背后多半有一个伟大的女人.", man.GetType ().Name ,this .GetType ().Name );
}
public void GetWomanConclusion(Person woman)
{
Console.WriteLine(@"{0}{1}时,背后多半有一个不成功的男人.", woman.GetType().Name , this.GetType().Name);
}
}
//下面是
对象结构 类
class ObjectStructure
{
private readonly List<Person> _elements = new List<Person>();
public void Add(Person element)
{
_elements.Add(element);
}
public void Del(Person element)
{
_elements.Remove(element);
}
//遍历显示
public void Display(IVisitor visitor)
{
foreach (var e in _elements)
{
e.Accept(visitor);
}
}
}
下面是Client 调用
//new 对象结构
ObjectStructure o = new ObjectStructure();
o.Add(new Man());
o.Add(new Woman());
o.Display(new Love());
结果