一、访问者模式简介(Brief Intro<?XML:NAMESPACE PREFIX = ST2 />duction)
表示一个作用于某对象结构中的元素操作。它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作,它把数据结构和作用于结构上的操作之间的耦合性解脱开,使的操作结合可以相对自由地演化。优点是增加新的操作很容易,因为增加一个新的操作就意味着增加一个新的访问者,访问者模式将有关的行为集中到一个访问对象中。
二、解决的问题(What To Solve)
访问者模式的目的是要把处理从数据结构分离出来。如果系统有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式是个不错的选择,因为访问者模式使的算法操作的增加变的容易。相反,如果系统的数据结构不稳定,易于变化,则此系统就不适合使用访问者模式了。
三、访问者模式分析(Analysis)
1、访问者模式结构
<?XML:NAMESPACE PREFIX = V /><?XML:NAMESPACE PREFIX = O />
Visitor
:为对象结构中
Element
的每一个子类声明一个
Visitor
操作。
ConcreteVisitor1
、ConcreteVisitor2
:具体的访问者,实现父类
Visitor
的操作。每个操作实现算法的一部分,而该算法片段仍是对应与结构中对象的类。
ObjectStructure
:枚举它的元素,可以提供一个高层的接口以允许访问者访问它的元素。
Element
:定义一个
Accept
操作,它以一个访问者为参数。
ConcreteElementA
、ConcreteElementB
:
具体元素,实现父类
Element
的方法
Accept
。
2、源代码
1
、访问者抽象类
Visitor
|
public
abstract class Visitor
{
public abstract void
VisitConcreteElementA(ConcreteElementA
concreteElementA);
public abstract void
VisitConcreteElementB(ConcreteElementB
concreteElementB);
}
|
2
、具体访问者
ConcreteVisitor1
、ConcreteVisitor2
|
public
class ConcreteVisitor1
: Visitor
{
public override void
VisitConcreteElementA(ConcreteElementA
concreteElementA)
{
Console
.WriteLine("{0}
访问{1}"
,this
.GetType().Name,concreteElementA.GetType().Name);
}
public override void
VisitConcreteElementB(ConcreteElementB
concreteElementB)
{
Console
.WriteLine("{0}
访问{1}"
, this
.GetType().Name, concreteElementB.GetType().Name);
}
}
public
class ConcreteVisitor2
: Visitor
{
public override void
VisitConcreteElementA(ConcreteElementA
concreteElementA)
{
Console
.WriteLine("{0}
访问{1}"
, this
.GetType().Name, concreteElementA.GetType().Name);
}
public override void
VisitConcreteElementB(ConcreteElementB
concreteElementB)
{
Console
.WriteLine("{0}
访问{1}"
, this
.GetType().Name, concreteElementB.GetType().Name);
}
|
3
、定义一个
Accept
操作,它以一个访问者为参数
|
public
abstract class Element
{
public abstract void
Accept(Visitor
visitor);
}
|
4
、具体元素
ConcreteElementA
、
ConcreteElementB
|
public
class ConcreteElementA
: Element
{
public override void
Accept(Visitor
visitor)
{
visitor.VisitConcreteElementA(this
);
}
public void
OperationA()
{
}
}
public
class ConcreteElementB
: Element
{
public override void
Accept(Visitor
visitor)
{
visitor.VisitConcreteElementB(this
);
}
public void
OperationB()
{
}
}
|
5
、对象结构
ObjectStructure
|
public
class ObjectStructure
{
IList
<Element
> elements=new List
<Element
>();
public void
Add(Element
e)
{
elements.Add(e);
}
public void
Remove(Element
e)
{
elements.Remove(e);
}
public void
Accept(Visitor
visitor)
{
foreach
(Element
e in
elements)
{
e.Accept(visitor);
}
}
}
|
5
、客户端代码
|
static
void <?XML:NAMESPACE PREFIX = ST1 />Main
(string
[] args)
{
ObjectStructure
os = new ObjectStructure
();
os.Add(new ConcreteElementA
());
os.Add(new ConcreteElementB
());
ConcreteVisitor1
cv1 = new ConcreteVisitor1
();
ConcreteVisitor2
cv2 = new ConcreteVisitor2
();
os.Accept(cv1);
os.Accept(cv2);
Console
.Read();
}
|
3、程序运行结果
四、总结(Summary)
访问者模式表示一个作用于某对象结构中的个元素操作。它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作
.
访问者模式的目的是要把处理从数据结构分离出来
转载于:https://blog.51cto.com/smartlife/271360