访问者模式(Visitor) 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作.
可以这么理解,访问者模式实际上是分离了容器结构中的元素和对这些元素进行操作的行为,然而容器对象就象是个大染缸,本来有各种鲜明类型的对象一旦放入后,再取出时,这些类型就消失了,这时我们就可以使用访问者模式来加以处理.
public interface IVisitor
{
void Process(ScheduleElement element);
} // interface IVisitor
public interface IElement
{
void Accept(IVisitor visit);
} // interface IElement
public class ScheduleVisitor : IVisitor
{
public void Process(ScheduleElement element)
{
}
} // ScheduleVisitor
public class ScheduleElement : IElement
{
private IVisitor m_Visit;
public void Accept(IVisitor visit)
{
m_Visit = visit;
}
public void Opterator()
{
m_Visit.Process(this);
}
} // class ScheduleElement
public class Client
{
public void Process()
{
ScheduleElement ele = new ScheduleElement();
ScheduleVisitor vis = new ScheduleVisitor();
ele.Accept(vis);
ele.Opterator();
}
} // class Client
以下情况 考虑使用访问者模式:
当一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象实施一些依赖于其具体类的操作.
需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而你想避免让这些操作”污染”这些对象的类.访问者使得你可以将相关的操作集中起来定义在一个类中.当该对象结构被很多应用共享时,用访问者模式让每个应用仅包含需要用到的操作.
定义对象结构的类很少改变,但经常需要在此结构上定义新的操作.改变对象结构类需要重定义对所有访问者的接口,这可能需要很大的代价.如果对象结构类经常改变,那么可能还是在这些类中定义这些操作较好.