迭代器模式

迭代器模式定义

迭代器模式(Façade),提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。

迭代器模式结构图

迭代器模式结构图如下所示:

01 迭代器模式结构图

迭代器模式在C#、Java等面向对象的语言中已经封装了,所以平时我们用到的机会非常的少,这里只提供了一个实例的代码,用于理解。

迭代器模式特点

① 当你需要访问一个聚焦对象,而且不管这些对象是什么都需要遍历的时候,你就应该考虑用迭代器模式。也就是说,你需要对聚焦有多种方法遍历时,可以考虑用迭代器模式。

② 迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器中类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。

迭代器模式实例应用

迭代器模式实例应用类图

02 迭代器模式实例应用类图

迭代器模式实例应用代码

  1 #include <iostream>
  2 #include <vector>
  3 using namespace std;
  4 
  5 /* object可以是任意类型的变量 */
  6 typedef int object;
  7 // 迭代器父类
  8 class CIterator
  9 {
 10 public:
 11     virtual object First() = 0;
 12     virtual void   Next() = 0;
 13     virtual object Current() = 0;
 14     virtual bool   IsDone() = 0;
 15 };
 16 
 17 // 聚集抽象类
 18 class CConcreteAggregate
 19 {
 20 private:
 21     vector<object> items;
 22 
 23 public:
 24     void AddObject(object obj)
 25     {
 26         items.push_back(obj);
 27     }
 28     
 29     // 重载了[]对象
 30     object& operator[](int index)
 31     {
 32         return items[index];
 33     }
 34 
 35     // 获得大小
 36     int GetSize()
 37     {
 38         return items.size();
 39     }
 40 };
 41 
 42 // 正序迭代器类
 43 class CConcreteIterator : public CIterator
 44 {
 45 public:
 46     CConcreteAggregate *agg;    
 47     int current;
 48 public:
 49     CConcreteIterator(CConcreteAggregate *agg)
 50     {
 51         this->agg = agg;
 52         current = 0;
 53     }
 54     virtual object First()
 55     {
 56         return (*agg)[0];
 57     }
 58     virtual void Next()
 59     {
 60         current++;
 61     }
 62 
 63     virtual object Current()
 64     {
 65         return (*agg)[current];
 66     }
 67 
 68     virtual bool IsDone()
 69     {
 70         return (current == agg->GetSize());
 71     }
 72 };
 73 
 74 // 逆序迭代器
 75 class CConcreteIteratorDesc : public CIterator
 76 {
 77 public:
 78     CConcreteAggregate *agg;    
 79     int current;
 80 public:
 81     CConcreteIteratorDesc(CConcreteAggregate *agg)
 82     {
 83         this->agg = agg;
 84         current = agg->GetSize() - 1;
 85     }
 86     virtual object First()
 87     {
 88         return (*agg)[current];
 89     }
 90     virtual void Next()
 91     {
 92         current--;
 93     }
 94 
 95     virtual object Current()
 96     {
 97         return (*agg)[current];
 98     }
 99 
100     virtual bool IsDone()
101     {
102         return current < 0 ? true : false;
103     }
104 };
105 
106 
107 int main()
108 {
109     CConcreteAggregate *objects =new CConcreteAggregate();
110     object a = 1;
111     object b = 2;    
112     object c = 3;
113     object d = 4;
114     object e = 5;
115     object f = 6;
116 
117     objects->AddObject(a);
118     objects->AddObject(b);
119     objects->AddObject(c);
120     objects->AddObject(d);
121     objects->AddObject(e);
122     objects->AddObject(f);
123 
124     // 正序
125     CConcreteIterator *iter1 = new CConcreteIterator(objects);
126     while(iter1->IsDone() != true)
127     {
128         cout << iter1->Current() << " ";
129         iter1->Next();
130     }
131     cout << endl;
132 
133     //  逆序
134     CConcreteIteratorDesc *iter2 = new CConcreteIteratorDesc(objects);
135     while(iter2->IsDone() != true)
136     {
137         cout << iter2->Current() << " ";
138         iter2->Next();
139     }
140     cout << endl;
141 
142     delete objects;
143     delete iter1;
144     delete iter2;
145     return 0;
146 }

2014-12-05   18:33:43

 

posted on 2014-12-05 18:24  xiaoheike  阅读(290)  评论(0)    收藏  举报

导航