架构设计设计模式C++实现迭代器模式.docx
- 文档编号:24357054
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:14
- 大小:287.75KB
架构设计设计模式C++实现迭代器模式.docx
《架构设计设计模式C++实现迭代器模式.docx》由会员分享,可在线阅读,更多相关《架构设计设计模式C++实现迭代器模式.docx(14页珍藏版)》请在冰豆网上搜索。
架构设计设计模式C++实现迭代器模式
模式定义
迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
迭代器模式让我们能游走于聚合内的每一个元素,而又不暴露其内部的表示。
把游走的任务放在迭代器上,而不是聚合上。
这样简化了聚合的接口和实现,也让责任各得其所。
模式结构:
Iterator:
迭代器定义访问和遍历元素的接口
ConcreteIterator:
具体迭代器实现迭代器接口;对该聚合遍历时跟踪当前位置
Aggregate:
聚合定义创建相应的迭代器对象接口
ConcreteAggregate:
具体聚合实现创建相应迭代器的接口,该操作返回ConcreteIterator的一个适当的实例。
举例:
煎饼屋和午餐店合并后需要定制一份新的餐单,但由于煎饼屋的原菜单是用链表实现,而午餐点原菜单是用数组实现(他们的定义如下所示),所以打印新餐单的时候需要分别循环遍历原餐单中的菜单项。
[cpp] viewplaincopy
1.//菜单项类
2.class MenuItem
3.{
4.public:
5. MenuItem(){}
6. MenuItem(string na, string descrip, double pric)
7. {
8. name = na;
9. description = descrip;
10. price = pric;
11. }
12.
13. string getName()
14. {
15. return name;
16. }
17.
18. string getDescription()
19. {
20. return description;
21. }
22.
23. double getPrice()
24. {
25. return price;
26. }
27.private:
28. string name;
29. string description;
30. double price;
31.};
32.//煎饼屋餐单类
33.class PancakeHouseMenu
34.{
35.public:
36. PancakeHouseMenu()
37. {
38. addItem("K&B'S Breakfase","pacakes with eggs",2.99);
39. addItem("Buleberry Breakfase","pacakes with buleberries",3.99);
40. }
41.
42. void addItem(string na, string descrip, double ric)
43. {
44. MenuItem menuItem(na,descrip,ric);
45. menuItems.push_back(menuItem);
46. }
47. list
48. {
49. return menuItems;
50. }
51.private:
52. list
53.};
54.//午餐点餐单类
55.class DinerMenu
56.{
57.public:
58. DinerMenu()
59. {
60. addItem("Vegetarian BLT", "Bacon with lettuce", 2.99);
61. addItem("BLT", "Bacon with tomato", 3.99);
62. }
63. void addItem(string na, string descrip, double ric)
64. {
65. MenuItem menuItem(na,descrip,ric);
66. menuItems.push_back(menuItem);
67. }
68. vector
69. {
70. return menuItems;
71. }
72.private:
73. vector
74.};
75.//必须调用pancakeHouseMenu.getMenuItems()和//dinerMenu.getMenuItems()来取得他们的餐单
76.PancakeHouseMenu pancakeHouseMenu;
77.list
78.DinerMenu dinerMenu;
79.vector
80.
81. list
:
iterator iter = breakfastItems.begin();
82. //打印新餐单的时候需要分别循环遍历原餐单中的菜单项
83. for(; iter !
= breakfastItems.end(); ++iter)
84. {
85. MenuItem menuItem = *iter;
86. cout << menuItem.getName() << " "<< menuItem.getPrice()<<" "
87. << menuItem.getDescription() << endl;
88. }
89.
90. for(unsigned int i=0; i 91. { 92. MenuItem menuItem = lunchItem[i]; 93. cout << menuItem.getName() << " "<< menuItem.getPrice()<<" " 94. << menuItem.getDescription() << endl; 95. } 96. return 0; 97.} 如果还有第三家餐厅加入,我们还需要第三个循环,意味着要写很多重复代码。 解决方法利用迭代器模式。 UML设计: 编程实现及执行结果: 1.#include 2.#include 3.#include 4.#include 5.using namespace std; 6.//菜单项类 7.class MenuItem 8.{ 9.public: 10. MenuItem(){} 11. MenuItem(string na, string descrip, double pric) 12. { 13. name = na; 14. description = descrip; 15. price = pric; 16. } 17. string getName() 18. { 19. return name; 20. } 21. string getDescription() 22. { 23. return description; 24. } 25. 26. double getPrice() 27. { 28. return price; 29. } 30.private: 31. string name; 32. string description; 33. double price; 34.}; 35.//迭代器基类 36.class Iterator 37.{ 38.public: 39. //是否有下一个一个菜单 40. virtual bool hasNext(){throw std: : exception("ERROR");}; 41. //取下一个菜单 42. virtual MenuItem next(){throw std: : exception("ERROR");}; 43.}; 44.//煎饼屋餐单迭代器 45.class PancakeHouseMenuIterator : public Iterator 46.{ 47.public: 48. PancakeHouseMenuIterator(list 49. { 50. items = item; 51. iter = items.begin(); 52. } 53. MenuItem next() 54. { 55. MenuItem menuItem = *iter; 56. ++iter; 57. return menuItem; 58. } 59. bool hasNext() 60. { 61. if(iter == items.end()) 62. { 63. return false; 64. } 65. else 66. { 67. return true; 68. } 69. } 70.private: 71. list 72. list : const_iterator iter; 73.}; 74.//午餐店餐单迭代器 75.class DinerMenuIterator : public Iterator 76.{ 77.public: 78. DinerMenuIterator(vector position(0) 79. { 80. items = item; 81. } 82. MenuItem next() 83. { 84. MenuItem menuItem = items[position]; 85. position = position + 1; 86. return menuItem; 87. } 88. 89. bool hasNext() 90. { 91. if(position >= items.size()) 92. { 93. return false; 94. } 95. else 96. { 97. return true; 98. } 99. } 100.private: 101. vector 102. unsigned int position; 103.}; 104. 105.//餐单基类 106.class Menu 107.{ 108.public: 109. //创建迭代器 110. virtual Iterator* createIterator(){throw std: : exception("ERROR");} 111.}; 112. 113. 114. 115.//煎饼屋餐单类 116.class PancakeHouseMenu : public Menu 117.{ 118.public: 119. PancakeHouseMenu() 120. { 121. addItem("K&B'S Breakfase","pacakes with eggs",2.99); 122. addItem("Buleberry Breakfase","pacakes with buleberries",3.99); 123. } 124. //增加菜单 125. void addItem(string na, string descrip, double ric) 126. { 127. MenuItem menuItem(na,descrip,ric); 128. menuItems.push_back(menuItem); 129. } 130. //创建PancakeHouseMenuIterator迭代器 131. Iterator* createIterator() 132. { 133. return new PancakeHouseMenuIterator(menuItems); 134. } 135.private: 136. list 137.}; 138. 139.//午餐点餐单类 140.class DinerMenu : public Menu 141.{ 142.public: 143. DinerMenu() 144. { 145. addItem("Vegetarian BLT", "Bacon with lettuce", 2.99); 146. addItem("BLT", "Bacon with tomato", 3.99); 147. } 148. void addItem(string na, string descrip, double ric) 149. { 150. MenuItem menuItem(na,descrip,ric); 151. menuItems.push_back(menuItem); 152. } 153. Iterator* createIterator() 154. { 155. return new DinerMenuIterator(menuItems); 156. } 157.private: 158. vector 159.}; 160. 161.//服务生类 162.class Waitress 163.{ 164.public: 165. Waitress(Menu* p_PancakeHouseMenu, Menu* p_DinerMenu) 166. { 167. pPancakeHouseMenu = p_PancakeHouseMenu; 168. pDinerMenu = p_DinerMenu; 169. } 170. //打印菜单 171. void printMenu() 172. { 173. Iterator* pPancakeHouseIterator = pPancakeHouseMenu->createIterator(); 174. Iterator* pDinerIterator = pDinerMenu->createIterator(); 175. 176. cout << "Menu"<< endl <<"----"< 177. printMenu(pPancakeHouseIterator); 178. cout << "LUNCH" << endl; 179. printMenu(pDinerIterator); 180. } 181. //因为抽象出迭代器,所以可以根据迭代器打印菜单 182. void printMenu(Iterator* iter) 183. { 184. while(iter->hasNext()) 185. { 186. MenuItem menuItem = (MenuItem)iter->next(); 187. cout << menuItem.getName() << " "<< menuItem.getPrice()<<" " 188. << menuItem.getDescription() << endl; 189. } 190. } 191.private: 192. Menu* pPancakeHouseMenu; 193. Menu* pDinerMenu; 194.}; 195.//客户代码 196.int main() 197.{ 198. Menu* pPancakeHouseMenu = new PancakeHouseMenu(); 199. Menu* pDinerMenu = new DinerMenu(); 200. 201. Waitress waitress(pPancakeHouseMenu,pDinerMenu); 202. waitress.printMenu(); 203. return 0; 204.} 执行结果: Menu ---- BREAKFAST K&B'SBreakfase2.99 pacakeswitheggs BuleberryBreakfase 3.99 pacakeswithbuleberries LUNCH VegetarianBLT 2.99 Baconwithlettuce BLT 3.99 Baconwithtomato 请按任意键继续... 设计原则的应用: 设计原则: 一个类应该只有一个引起变化的原因。 这个原则告诉我们尽量让一个类保持单一责任。 如果一个类具有两个以上改变的原因,那么这会使将来该类的变化率上升。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 架构 设计 模式 C+ 实现 迭代器