迭代器模式
迭代器模式定义
迭代器模式(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
浙公网安备 33010602011771号