|
V:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
访问者模式适用于数据结构相对稳定的系统。它把数据结构和作用于结构上的操作之间的耦合解脱开,使得操作集合可以相对自由地演化。
访问者模式的目的是要把处理从数据结构分离出来。有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式就是比较合适的,因为访问者模式使得算法操作的增加变得容易。
优点:仿问者模式的优点就是增加新的操作很容易,因为增加新的操作就意味着增加一个新的访问者。访问者模式将有关的行为集中到一个访问者对象中。
缺点:使增加新的数据结构变得困难了。

abstract class State
{
public abstract void GetManConclusion(Male male);
public abstract void GetWomanConclusion(Female female);
}
class Success:State
{
public override void GetManConclusion(Male male)
{
Console.WriteLine(string.Format("{0} {1}时,背后多半有一个伟大的女人。", male.GetType().Name, this.GetType().Name));
}
public override void GetWomanConclusion(Female female)
{
Console.WriteLine(string.Format("{0} {1}时,背后大多有一个不成功的男人。", female.GetType().Name, this.GetType().Name));
}
}
class Failure:State
{
public override void GetManConclusion(Male male)
{
Console.WriteLine(string.Format("{0} {1}时,闷头喝酒,谁也不用劝。", male.GetType().Name, this.GetType().Name));
}
public override void GetWomanConclusion(Female female)
{
Console.WriteLine(string.Format("{0} {1}时,眼泪汪汪,谁也劝不了。", female.GetType().Name, this.GetType().Name));
}
}
class Love:State
{
public override void GetManConclusion(Male male)
{
Console.WriteLine(string.Format("{0} {1}时,凡事不懂也要装懂。", male.GetType().Name, this.GetType().Name));
}
public override void GetWomanConclusion(Female female)
{
Console.WriteLine(string.Format("{0} {1}时,遇事懂也装作不懂。", female.GetType().Name, this.GetType().Name));
}
}
class Marriage : State
{
public override void GetManConclusion(Male male)
{
Console.WriteLine(string.Format("{0} {1}时,感慨道:恋爱游戏终结时,‘有妻徒刑’遥无期。", male.GetType().Name, this.GetType().Name));
}
public override void GetWomanConclusion(Female female)
{
Console.WriteLine(string.Format("{0} {1}时,欣慰道:爱情长跑路漫漫,婚姻保险保平安。", female.GetType().Name, this.GetType().Name));
}
}
abstract class Human
{
public abstract void Accept(State state);
}
class Male:Human
{
public override void Accept(State state)
{
state.GetManConclusion(this);
}
}
class Female:Human
{
public override void Accept(State state)
{
state.GetWomanConclusion(this);
}
}
class ObjectStructure
{
private IList<Human> elements = new List<Human>();
public void Attach(Human element)
{
elements.Add(element);
}
public void Detach(Human element)
{
elements.Remove(element);
}
public void Display(State1 state)
{
foreach (Human element in elements)
{
element.Accept(state);
}
}
}
ObjectStructure os = new ObjectStructure();
os.Attach(new Male());
os.Attach(new Female());
Success s = new Success();
os.Display(s);
Failure f = new Failure();
os.Display(f);
Love l = new Love();
os.Display(l);
Marriage m = new Marriage();
os.Display(m);
|