Net设计模式实例之访问者模式(Visitor Pattern)
一、访问者模式简介(Brief Introdu ction)
表示一个作用于某对象结构中的元素操作。它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作,它把数据结构和作用于结构上的操作之间的耦合性解脱开,使的操作结合可以相对自由地演化。优点是增加新的操作很容易,因为增加一个新的操作就意味着增加一个新的访问者,访问者模式将有关的行为集中到一个访问对象中。
二、解决的问题(What To Solve)
访问者模式的目的是要把处理从数据结构分离出来。如果系统有比较稳定的数据结构,又有易于变化的算法的话,使用访问者模式是个不错的选择,因为访问者模式使的算法操作的增加变的容易。相反,如果系统的数据结构不稳定,易于变化,则此系统就不适合使用访问者模式了。
三、访问者模式分析(Analysis)
1、访问者模式结构
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 { 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)
访问者模式表示一个作用于某对象结构中的个元素操作。它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 访问者模式的目的是要把处理从数据结构分离出来
出处: http://www.cnblogs.com/ywqu
如果你认为此文章有用,请点击底端的【推荐】让其他人也了解此文章,
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。