行为型模式-访问者模式
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
namespace 访问者模式
{
/*
* 访问模式意图:表示一个作用于某对象结构中的各个元素的操作。它可以在不改变各元素的类的前提下定义作用于这些元素的新的操作。
*
* 访问模式实现要点:1、通过一个稳定的管理容器管理所要访问的元素
*
* 访问者模式适用场景:1、当有一个效果上的密封类层次
* 2、要做这个类的层次上执行多种不同的操作
* 3、这些操作跟类层次的核心功能相互正交
* 4、对那个需要拥有在日后定义新操作的灵活性
*/
///<summary>
/// 为对象结构中Element的每一个子类声明一个Visitor操作。
///</summary>
publicabstractclass Visitor
{
publicabstractvoid VisitConcreteElementA(ConcreteElementA a);
publicabstractvoid VisitConcreteElementB(ConcreteElementB b);
}
///<summary>
/// 具体的访问类
///</summary>
publicclass ConcreteVisitor1 : Visitor
{
publicoverridevoid VisitConcreteElementA(ConcreteElementA a1)
{
//访问a元素的相关数据
}
publicoverridevoid VisitConcreteElementB(ConcreteElementB b1)
{
//访问b元素的相关数据
}
}
publicclass ConcreteVisitor2 : Visitor
{
publicoverridevoid VisitConcreteElementA(ConcreteElementA a2)
{
//访问具体a2元素相关数据
}
publicoverridevoid VisitConcreteElementB(ConcreteElementB b2)
{
//访问具体b2元素相关数据
}
}
///<summary>
/// 定义一个Accept操作,它以一个访问者为参数。
///</summary>
publicabstractclass Element
{
publicabstractvoid Accept(Visitor visitor);
}
publicclass ConcreteElementA : Element
{
publicoverridevoid Accept(Visitor visitor)
{
visitor.VisitConcreteElementA(this);
}
publicvoid OperationA()
{
//A元素的一些操作
}
}
publicclass ConcreteElementB : Element
{
publicoverridevoid Accept(Visitor visitor)
{
visitor.VisitConcreteElementB(this);
}
}
///<summary>
/// 枚举它的元素,可以提供一个高层的接口以允许访问者访问它的元素
///</summary>
publicclass ObjectStructure
{
IList<Element> elements =new List<Element>();
publicvoid Add(Element e)
{
elements.Add(e);
}
publicvoid Remove(Element e)
{
elements.Remove(e);
}
publicvoid Accept(Visitor visitor)
{
foreach (Element e in elements)
{
e.Accept(visitor);
}
}
}
publicclass AppClient
{
publicstaticvoid Main(string[] args)
{
ObjectStructure os =new ObjectStructure();
os.Add(new ConcreteElementA());
os.Add(new ConcreteElementB());
ConcreteVisitor1 visitor1 =new ConcreteVisitor1();
ConcreteVisitor2 visitor2 =new ConcreteVisitor2();
os.Accept(visitor1);
os.Accept(visitor2);
}
}
}
using System.Collections.Generic;
using System.Text;
using System.Collections;
namespace 访问者模式
{
/*
* 访问模式意图:表示一个作用于某对象结构中的各个元素的操作。它可以在不改变各元素的类的前提下定义作用于这些元素的新的操作。
*
* 访问模式实现要点:1、通过一个稳定的管理容器管理所要访问的元素
*
* 访问者模式适用场景:1、当有一个效果上的密封类层次
* 2、要做这个类的层次上执行多种不同的操作
* 3、这些操作跟类层次的核心功能相互正交
* 4、对那个需要拥有在日后定义新操作的灵活性
*/
///<summary>
/// 为对象结构中Element的每一个子类声明一个Visitor操作。
///</summary>
publicabstractclass Visitor
{
publicabstractvoid VisitConcreteElementA(ConcreteElementA a);
publicabstractvoid VisitConcreteElementB(ConcreteElementB b);
}
///<summary>
/// 具体的访问类
///</summary>
publicclass ConcreteVisitor1 : Visitor
{
publicoverridevoid VisitConcreteElementA(ConcreteElementA a1)
{
//访问a元素的相关数据
}
publicoverridevoid VisitConcreteElementB(ConcreteElementB b1)
{
//访问b元素的相关数据
}
}
publicclass ConcreteVisitor2 : Visitor
{
publicoverridevoid VisitConcreteElementA(ConcreteElementA a2)
{
//访问具体a2元素相关数据
}
publicoverridevoid VisitConcreteElementB(ConcreteElementB b2)
{
//访问具体b2元素相关数据
}
}
///<summary>
/// 定义一个Accept操作,它以一个访问者为参数。
///</summary>
publicabstractclass Element
{
publicabstractvoid Accept(Visitor visitor);
}
publicclass ConcreteElementA : Element
{
publicoverridevoid Accept(Visitor visitor)
{
visitor.VisitConcreteElementA(this);
}
publicvoid OperationA()
{
//A元素的一些操作
}
}
publicclass ConcreteElementB : Element
{
publicoverridevoid Accept(Visitor visitor)
{
visitor.VisitConcreteElementB(this);
}
}
///<summary>
/// 枚举它的元素,可以提供一个高层的接口以允许访问者访问它的元素
///</summary>
publicclass ObjectStructure
{
IList<Element> elements =new List<Element>();
publicvoid Add(Element e)
{
elements.Add(e);
}
publicvoid Remove(Element e)
{
elements.Remove(e);
}
publicvoid Accept(Visitor visitor)
{
foreach (Element e in elements)
{
e.Accept(visitor);
}
}
}
publicclass AppClient
{
publicstaticvoid Main(string[] args)
{
ObjectStructure os =new ObjectStructure();
os.Add(new ConcreteElementA());
os.Add(new ConcreteElementB());
ConcreteVisitor1 visitor1 =new ConcreteVisitor1();
ConcreteVisitor2 visitor2 =new ConcreteVisitor2();
os.Accept(visitor1);
os.Accept(visitor2);
}
}
}