C#设计模式-访问者模式

时间:2015-03-15 22:40:18   收藏:0   阅读:804

一、访问者模式介绍

1.1 访问者模式的定义

   表示一个作用于某对象结构中的各个元素的操作。它使你可以在不改变各个元素的类的前提下定义作用于这些元素的新操作。

1.2 访问者模式的结构图

   具体的访问者模式结构图如下所示。

技术分享

  这里需要明确一点:访问者模式中具体访问者的数目和具体节点的数目没有任何关系。从访问者的结构图可以看出,访问者模式涉及以下几类角色。

2.3 访问者模式的实现

   具体实现代码如下所示:

技术分享
 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     }
View Code

主程序示例如下:

技术分享
 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         }
View Code

 

二、访问者模式的应用场景

   每个设计模式都有其应当使用的情况,那让我们看看访问者模式具体应用场景。如果遇到以下场景,此时我们可以考虑使用访问者模式。

三、访问者模式的优缺点 

   访问者模式具有以下优点:

  访问者模式也有如下的缺点:

四、总结

  访问者模式是用来封装一些施加于某种数据结构之上的操作。它使得可以在不改变元素本身的前提下增加作用于这些元素的新操作,访问者模式的目的是把操作从数据结构中分离出来。

评论(0)
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!