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

全部博文(438)

文章存档

2019年(1)

2013年(8)

2012年(429)

分类: C/C++

2012-03-25 19:18:36

迭代器是这么个东西:
  1. interface Iterator
  2. {
  3.     virtual bool hasNext() = 0;
  4.     virtual Object* next() = 0;
  5. };

它用于遍历一个集合。这个集合的内部实现可以是数组、链表甚至是哈希表,但外部根本不需要知道,只要这个集合提供出一个得到Iterator的方法:
  1. class Collection
  2. {
  3. public:
  4.     Iterator createIterator();
  5. };

这样客户就可以简单地遍历这个集合:
  1. class Client
  2. {
  3.     void DoSomething(Collection* pCollection)
  4.     {
  5.         Iterator itor = pCollection->createIterator();
  6.         while(itor.hasNext())
  7.             Object* pObj = itor.next();
  8.     }
  9. };

设计原则:一个类应该只有一个引起变化的原因。

把遍历从集合本身独立出来就是为了分离变化,这样集合本身职责就更加单一,它不需要承担遍历方法改变的风险。比如要支持逆向遍历时,只要添加或改变iterator,而集合本身并不用太大改变。


当一个集合是一个层次结构,比如是一棵树时,简单的迭代器就有点捉襟见肘了。如何把这样的层次结构封装得好呢?怎样对外部隐藏实现细节,但又能够表示出这种层次结构?
定义一个接口Component:
  1. interface Component
  2. {
  3.     virtual void add(Component*) = 0;
  4.     virtual void remove(Component*) = 0;
  5.     virtual Component* getChild(int) = 0;
  6. };

集合中所有的结点都实现这个接口。每个结点可以是两种类型:Leaf或Composite
  1. class Leaf : public Component
  2. {
  3.     // doesn't support add/remove/getChild
  4. };

  5. class Composite : public Component
  6. {
  7. public:
  8.     virtual void add(Component*);
  9.     virtual void remove(Component*);
  10.     virtual Component* getChild(int);
  11. };

组合模式允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。


有了组合模式后,Component就可以提供适合于它的iterator。

Comopsite的CompositeIterator同样实现了接口Iterator,同样有hasNext和next。不同的是它会(以递归的方式)遍历以composite为根的树上的所有结点。

而Leaf的iterator是一个空对象:
  1. class NullIterator : public Iterator
  2. {
  3. public:
  4.     virtual bool hasNext() { return false; }
  5.     virtual Object* next() { return NULL; }
  6. };

空对象的好处是避免了过多的NULL判断。如果Leaf::CreateIterator可以返回NULL的话,那我们就要在每一个createIterator调用后判断一下返回值是否为NULL。有了空对象后就可以把NullObject当成普通对象来用。
阅读(859) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~