首页 > 其他 > 详细

设计模式之美:Visitor(访问者)

时间:2014-03-31 09:20:51      阅读:486      评论:0      收藏:0      [点我收藏+]

索引

意图

表示一个作用于某对象结构中的各元素的操作。

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.

结构

bubuko.com,布布扣

参与者

Visitor

  • 为该对象结构中 ConcreteElement 的每一个类声明一个 Visit 操作。该操作的名字和特征标识了发送 Visit 请求给该访问者的那个类。

ConcreteVisitor

  • 实现每个由 Visitor 声明的操作。

Element

  • 定义一个 Accept 操作,它以一个 Visitor 为参数。

ConcreteElement

  • 实现 Accept 操作,该操作以一个 Visitor 为参数。

ObjectStructure

  • 能枚举 Element。
  • 可以提供一个高层的接口以允许该 Visitor 访问它的元素。
  • 可以是一个 Composite 或是一个集合、列表或无序集合。

适用性

在以下情况下可以使用 Visitor 模式:

  • 一个对象结构包含很多类操作,它们有不同的接口,而你想对这些对象实施一些依赖于其具体类的操作。
  • 需要对一个对象结构中的对象进行很多不同的并且不相关的操作,而你想避免让这些操作污染这些对象的类。
  • 定义对象结构的类很少改变,但经常需要在此结构上定义新的操作。

缺点

  • 增加新的 ConcreteElement 类很困难。添加新的 ConcreteElement 都要在 Visitor 中添加一个新的抽象操作。
  • 可能破坏封装。Visitor 假定 ConcreteElement 接口的功能足够强,足以让 Visitor 进行它的工作。但有时会迫使你提供 ConcreteElement 的内部状态的公共操作。

效果

  • Visitor 模式使得易于增加新的操作。
  • Visitor 集中相关的操作而分离无关的操作。

相关模式

  • Visitor 可以用于对一个 Composite 模式定义的对象结构进行操作。
  • Visitor 可以用于 Interpreter 解释。

实现

实现方式(一):Visitor 模式结构样式代码。

bubuko.com,布布扣
  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 }
bubuko.com,布布扣

设计模式之美》为 Dennis Gao 发布于博客园的系列文章,任何未经作者本人同意的人为或爬虫转载均为耍流氓。

设计模式之美:Visitor(访问者),布布扣,bubuko.com

设计模式之美:Visitor(访问者)

原文:http://www.cnblogs.com/gaochundong/p/design_pattern_visitor.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!