名称:访问者模式
意图:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
适用环境:
1、一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象实施一些依赖于其具体类的操作。
2、需要对一个对象结构中的对象进行很多不同的并且不想的操作,而你想避免让这些操作“污染”这些对象的类。Visitor使得你可以将相关的操作集中起来定义在一个类中。当该对象结构被很多应用共享时,用Visitor模式让每个应用仅包含需要用到的操作。
3、定义对象结构的类很少改变,但经常需要在此结构上定义新的操作。改变对象结构类需要重定义对所有访问者的接口,这可能需要很大的代价。如果对象结构类经常改变,那么可能还是在这些类中定义这些操作较好。
abstractclassVisitor
{
publicabstractvoidVisitConcreteElementA(
ConcreteElementAconcreteElementA);
publicabstractvoidVisitConcreteElementB(
ConcreteElementBconcreteElementB);
}
classConcreteVisitor1: Visitor
{
publicoverridevoidVisitConcreteElementA(
ConcreteElementAconcreteElementA)
{
Console.WriteLine("{0} visited by {1}",
concreteElementA.GetType().Name,this.GetType().Name) ;
}
publicoverridevoidVisitConcreteElementB(ConcreteElementBconcreteElementB)
{
Console.WriteLine("{0} visited by {1}",
concreteElementB.GetType().Name, this.GetType().Name);
}
}
classConcreteVisitor2: Visitor
{
publicoverridevoidVisitConcreteElementA(ConcreteElementAconcreteElementA)
{
Console.WriteLine("{0} visited by {1}",
concreteElementA.GetType().Name, this.GetType().Name);
}
publicoverridevoidVisitConcreteElementB(ConcreteElementBconcreteElementB)
{
Console.WriteLine("{0} visited by {1}",
concreteElementB.GetType().Name, this.GetType().Name);
}
}
abstractclassElement
{
publicabstractvoidAccept(Visitorvisitor);
}
classConcreteElementA: Element
{
publicoverridevoidAccept(Visitorvisitor)
{
visitor.VisitConcreteElementA(this);
}
publicvoidOperationA()
{
}
}
classConcreteElementB: Element
{
publicoverridevoidAccept(Visitorvisitor)
{
visitor.VisitConcreteElementB(this);
}
publicvoidOperationB()
{
}
}
classObjectStructure
{
privateList<Element> _elements = newList<Element>();
publicvoidAttach(Elementelement)
{
_elements.Add(element);
}
publicvoidDetach(Elementelement)
{
_elements.Add(element);
}
publicvoidAccept(Visitorvistor)
{
foreach(Elementelement in_elements)
{
element.Accept(vistor);
}
}
}
调用:
ObjectStructureov = newObjectStructure();
ov.Attach(newConcreteElementA());
ov.Attach(newConcreteElementB());
ConcreteVisitor1v1 = newConcreteVisitor1();
ConcreteVisitor2v2 = newConcreteVisitor2();
ov.Accept(v1);
ov.Accept(v2);
输出:
ConcreteElementA visited by ConcreteVisitor1
ConcreteElementB visited by ConcreteVisitor1
ConcreteElementA visited by ConcreteVisitor2
23种设计模式介绍、示例代码下载:C#23种设计模式.pdf