索引
表示一个作用于某对象结构中的各元素的操作。
Visitor 使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
Represent an operation to be performed on the elements of an object structure.
Visitor lets you
define a new operation without changing the classes of the elements on which it
operates.
Visitor
ConcreteVisitor
Element
ConcreteElement
ObjectStructure
在以下情况下可以使用 Visitor 模式:
1 namespace VisitorPattern.Implementation1 2 { 3 public abstract class Element 4 { 5 public abstract void Accept(Visitor visitor); 6 } 7 8 public abstract class Visitor 9 { 10 public abstract void Visit(ConcreteElementA element); 11 public abstract void Visit(ConcreteElementB element); 12 } 13 14 public class ObjectStructure 15 { 16 private List<Element> _elements = new List<Element>(); 17 18 public void Attach(Element element) 19 { 20 _elements.Add(element); 21 } 22 23 public void Detach(Element element) 24 { 25 _elements.Remove(element); 26 } 27 28 public void Accept(Visitor visitor) 29 { 30 foreach (var element in _elements) 31 { 32 element.Accept(visitor); 33 } 34 } 35 } 36 37 public class ConcreteElementA : Element 38 { 39 public string Name { get; set; } 40 41 public override void Accept(Visitor visitor) 42 { 43 visitor.Visit(this); 44 } 45 } 46 47 public class ConcreteElementB : Element 48 { 49 public string ID { get; set; } 50 51 public override void Accept(Visitor visitor) 52 { 53 visitor.Visit(this); 54 } 55 } 56 57 public class ConcreteVisitorA : Visitor 58 { 59 public override void Visit(ConcreteElementA element) 60 { 61 Console.WriteLine( 62 "ConcreteVisitorA visited ConcreteElementA : {0}", 63 element.Name); 64 } 65 66 public override void Visit(ConcreteElementB element) 67 { 68 Console.WriteLine( 69 "ConcreteVisitorA visited ConcreteElementB : {0}", 70 element.ID); 71 } 72 } 73 74 public class ConcreteVisitorB : Visitor 75 { 76 public override void Visit(ConcreteElementA element) 77 { 78 Console.WriteLine( 79 "ConcreteVisitorB visited ConcreteElementA : {0}", 80 element.Name); 81 } 82 83 public override void Visit(ConcreteElementB element) 84 { 85 Console.WriteLine( 86 "ConcreteVisitorB visited ConcreteElementB : {0}", 87 element.ID); 88 } 89 } 90 91 public class Client 92 { 93 public void TestCase1() 94 { 95 var objectStructure = new ObjectStructure(); 96 97 objectStructure.Attach(new ConcreteElementA()); 98 objectStructure.Attach(new ConcreteElementB()); 99 100 objectStructure.Accept(new ConcreteVisitorA()); 101 objectStructure.Accept(new ConcreteVisitorB()); 102 } 103 } 104 }
《设计模式之美》为 Dennis Gao 发布于博客园的系列文章,任何未经作者本人同意的人为或爬虫转载均为耍流氓。
设计模式之美:Visitor(访问者),布布扣,bubuko.com
原文:http://www.cnblogs.com/gaochundong/p/design_pattern_visitor.html