标签:
表示一个作用于某对象结构中的各个元素的操作。它使你可以在不改变各个元素的类的前提下定义作用于这些元素的新操作。
具体的访问者模式结构图如下所示。
这里需要明确一点:访问者模式中具体访问者的数目和具体节点的数目没有任何关系。从访问者的结构图可以看出,访问者模式涉及以下几类角色。
具体实现代码如下所示:
1 abstract class Visitor 2 { 3 public abstract void VisitConcreteElementA(ConcreteElementA concreteElementA); 4 5 public abstract void VisitConcreteElementB(ConcreteElementB concreteElementB); 6 } 7 8 class ConcreteVisitor1 : Visitor 9 { 10 public override void VisitConcreteElementA(ConcreteElementA concreteElementA) 11 { 12 Console.WriteLine("{0}被{1}访问", concreteElementA.GetType().Name, this.GetType().Name); 13 } 14 15 public override void VisitConcreteElementB(ConcreteElementB concreteElementB) 16 { 17 Console.WriteLine("{0}被{1}访问", concreteElementB.GetType().Name, this.GetType().Name); 18 } 19 } 20 21 class ConcreteVisitor2 : Visitor 22 { 23 public override void VisitConcreteElementA(ConcreteElementA concreteElementA) 24 { 25 Console.WriteLine("{0}被{1}访问", concreteElementA.GetType().Name, this.GetType().Name); 26 } 27 28 public override void VisitConcreteElementB(ConcreteElementB concreteElementB) 29 { 30 Console.WriteLine("{0}被{1}访问", concreteElementB.GetType().Name, this.GetType().Name); 31 } 32 } 33 34 abstract class Element 35 { 36 public abstract void Accept(Visitor visitor); 37 } 38 39 class ConcreteElementA : Element 40 { 41 public override void Accept(Visitor visitor) 42 { 43 visitor.VisitConcreteElementA(this); 44 } 45 46 public void OperationA() 47 { } 48 } 49 50 class ConcreteElementB : Element 51 { 52 public override void Accept(Visitor visitor) 53 { 54 visitor.VisitConcreteElementB(this); 55 } 56 57 public void OperationB() 58 { } 59 } 60 61 class ObjectStructure 62 { 63 private IList<Element> elements = new List<Element>(); 64 65 public void Attach(Element element) 66 { 67 elements.Add(element); 68 } 69 70 public void Detach(Element element) 71 { 72 elements.Remove(element); 73 } 74 75 public void Accept(Visitor visitor) 76 { 77 foreach (Element e in elements) 78 { 79 e.Accept(visitor); 80 } 81 } 82 }
主程序示例如下:
1 static void Main(string[] args) 2 { 3 ObjectStructure o = new ObjectStructure(); 4 o.Attach(new ConcreteElementA()); 5 o.Attach(new ConcreteElementB()); 6 7 ConcreteVisitor1 v1 = new ConcreteVisitor1(); 8 ConcreteVisitor2 v2 = new ConcreteVisitor2(); 9 10 o.Accept(v1); 11 o.Accept(v2); 12 13 Console.Read(); 14 }
每个设计模式都有其应当使用的情况,那让我们看看访问者模式具体应用场景。如果遇到以下场景,此时我们可以考虑使用访问者模式。
访问者模式具有以下优点:
访问者模式也有如下的缺点:
访问者模式是用来封装一些施加于某种数据结构之上的操作。它使得可以在不改变元素本身的前提下增加作用于这些元素的新操作,访问者模式的目的是把操作从数据结构中分离出来。
标签:
原文地址:http://www.cnblogs.com/Smart-boy/p/4340505.html