Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1800259
  • 博文数量: 438
  • 博客积分: 9799
  • 博客等级: 中将
  • 技术积分: 6092
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-25 17:25
文章分类

全部博文(438)

文章存档

2019年(1)

2013年(8)

2012年(429)

分类: C/C++

2012-03-25 20:24:16

当你需要遍历一个对象集合(比如链表或树)并对其中所有的元素进行操作时,可以为这个集合提供一个访问者。当然,这个集合也要支持访问者才行。支持访问者的元素定义为:
  1. class Element
  2. {
  3. public:
  4.     virtual void accept(Visitor*) = 0;
  5. };

集合里可以有各种不同类型的Element(即Element的子类),当集合接受访问时,它会遍历所有的元素,并让这些元素接受访问。
  1. class Collection
  2. {
  3. public:
  4.     void accept(Visitor* visitor)
  5.     {
  6.         foreach (Element* element in collection)
  7.             element->accept(visitor);
  8.     }
  9. };

通常Element的子类的accept方法会简单地调用Visitor的访问方法:
  1. class ElementTypeOne : Element
  2. {
  3. public:
  4.     virtual void accept(Visitor* visitor)
  5.     {
  6.         visitor->visitTypeOne(this);
  7.     }
  8. };

  9. class ElementTypeTwo : Element
  10. {
  11. public:
  12.     virtual void accept(Visitor* visitor)
  13.     {
  14.         visitor->visitTypeTwo(this);
  15.     }
  16. };

如此一来,Visitor的定义就是:
  1. interface Visitor
  2. {
  3.     virtual void visitTypeOne(ElementTypeOne*) = 0;
  4.     virtual void visitTypeTwo(ElementTypeTwo*) = 0;
  5. };

这样客户就可以用各种不同类型的Visitor来访问这个集合了。
  1. class Client
  2. {
  3.     void Visit(Collection* collection)
  4.     {
  5.         Visitor* v1 = new VisitorTypeA;
  6.         collection->accept(v1);

  7.         Visitor* v2 = new VisitorTypeB;
  8.         collection->accept(v2);
  9.     }
  10. };


访问者模式的优点自然是在不改变集合结构本身的前提下,提供各种新的操作。缺点就是牺牲了封装性,因为访问者需要知道结构中各元素的细节。

阅读(1772) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~