| 结构 |
 |
| 意图 |
表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 |
| 适用性 |
- 一个对象结构包含很多类对象,它们有不同的接口,而你想对这些对象实施一些依赖于其具体类的操作。
- 需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而你想避免让这些操作“污染”这些对象的类。Vi s i t o r 使得你可以将相关的操作集中起来定义在一个类中。当该对象结构被很多应用共享时,用Vi s i t o r 模式让每个应用仅包含需要用到的操作。
- 定义对象结构的类很少改变,但经常需要在此结构上定义新的操作。改变对象结构类需要重定义对所有访问者的接口,这可能需要很大的代价。如果对象结构类经常改变,那么可能还是在这些类中定义这些操作较好。
|
![]()
1 using System;
2
3 abstract class Visitor
4 {
5 abstract public void VisitElementA(ConcreteElementA a);
6 abstract public void VisitElementB(ConcreteElementB b);
7 }
8
9 class ConcreteVisitor1 : Visitor
10 {
11 override public void VisitElementA(ConcreteElementA a)
12 {
13
14 }
15
16 override public void VisitElementB(ConcreteElementB b)
17 {
18
19 }
20 }
21
22 abstract class Element
23 {
24 abstract public void Accept(Visitor v);
25 }
26
27 class ConcreteElementA : Element
28 {
29 public Visitor myVisitor;
30 override public void Accept(Visitor v)
31 {
32 myVisitor = v;
33 }
34
35 public void OperationA()
36 {
37
38 }
39
40 public void DoSomeWork()
41 {
42 // do some work here
43 // . . .
44
45 // Get visitor to visit
46 myVisitor.VisitElementA(this);
47
48 // do some more work here
49 // . . .
50 }
51 }
52
53 class ConcreteElementB : Element
54 {
55 override public void Accept(Visitor v)
56 {
57
58 }
59
60 public void OperationB()
61 {
62
63 }
64 }
65
66 /// <summary>
67 /// Summary description for Client.
68 /// </summary>
69 public class Client
70 {
71 public static int Main(string[] args)
72 {
73 ConcreteElementA eA = new ConcreteElementA();
74 ConcreteElementB eB = new ConcreteElementB();
75 ConcreteVisitor1 v1 = new ConcreteVisitor1();
76
77 eA.Accept(v1);
78 eA.DoSomeWork();
79
80 return 0;
81 }
82 }
访问者模式