加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

遍历聚合对象中的元素——迭代器模式(三)

发布时间:2020-12-14 05:26:34 所属栏目:百科 来源:网络整理
导读:遍历聚合对象中的元素——迭代器模式(三) 3?完整解决方案 ?????? 为了简化 AbstractObjectList 类的结构,并给不同的具体数据集合类提供不同的遍历方式, Sunny 软件公司开发人员使用迭代器模式来重构 AbstractObjectList 类的设计,重构之后的销售管理系

遍历聚合对象中的元素——迭代器模式(三)


3?完整解决方案

?????? 为了简化AbstractObjectList类的结构,并给不同的具体数据集合类提供不同的遍历方式,Sunny软件公司开发人员使用迭代器模式来重构AbstractObjectList类的设计,重构之后的销售管理系统数据遍历结构如图4所示:

图4?销售管理系统数据遍历结构图

(注:为了简化类图和代码,本结构图中只提供一个具体聚合类和具体迭代器类)

?????? 在图4中,AbstractObjectList充当抽象聚合类,ProductList充当具体聚合类,AbstractIterator充当抽象迭代器,ProductIterator充当具体迭代器。完整代码如下所示:

[java]? view plain copy
  1. //在本实例中,为了详细说明自定义迭代器的实现过程,我们没有使用JDK中内置的迭代器,事实上,JDK内置迭代器已经实现了对一个List对象的正向遍历??
  2. import?java.util.*;??
  3. ??
  4. //抽象聚合类??
  5. abstract?class?AbstractObjectList?{??
  6. ????protected?List<Object>?objects?=?new?ArrayList<Object>();??
  7. public?AbstractObjectList(List?objects)?{??
  8. ????????this.objects?=?objects;??
  9. ????}??
  10. ??????
  11. public?void?addObject(Object?obj)?{??
  12. this.objects.add(obj);??
  13. void?removeObject(Object?obj)?{??
  14. this.objects.remove(obj);??
  15. public?List?getObjects()?{??
  16. return?this.objects;??
  17. ????//声明创建迭代器对象的抽象工厂方法??
  18. ????abstract?AbstractIterator?createIterator();??
  19. }??
  20. //商品数据类:具体聚合类??
  21. class?ProductList?extends?AbstractObjectList?{??
  22. public?ProductList(List?products)?{??
  23. super(products);??
  24. //实现创建迭代器对象的具体工厂方法??
  25. public?AbstractIterator?createIterator()?{??
  26. ????????new?ProductIterator(this);??
  27. ????}??
  28. }???
  29. //抽象迭代器??
  30. interface?AbstractIterator?{??
  31. void?next();?//移至下一个元素??
  32. boolean?isLast();?//判断是否为最后一个元素??
  33. void?previous();?//移至上一个元素??
  34. boolean?isFirst();?//判断是否为第一个元素??
  35. public?Object?getNextItem();?//获取下一个元素??
  36. public?Object?getPreviousItem();?//获取上一个元素??
  37. //商品迭代器:具体迭代器??
  38. class?ProductIterator?implements?AbstractIterator?{??
  39. private?ProductList?productList;??
  40. private?List?products;??
  41. private?int?cursor1;?//定义一个游标,用于记录正向遍历的位置??
  42. int?cursor2;?//定义一个游标,用于记录逆向遍历的位置??
  43. ??????
  44. public?ProductIterator(ProductList?list)?{??
  45. this.productList?=?list;??
  46. this.products?=?list.getObjects();?//获取集合对象??
  47. ????????cursor1?=?0;?//设置正向遍历游标的初始值??
  48. ????????cursor2?=?products.size()?-1;?//设置逆向遍历游标的初始值??
  49. void?next()?{??
  50. if(cursor1?<?products.size())?{??
  51. ????????????cursor1++;??
  52. ????????}??
  53. boolean?isLast()?{??
  54. return?(cursor1?==?products.size());??
  55. void?previous()?{??
  56. if?(cursor2?>?-1)?{??
  57. ????????????cursor2--;??
  58. boolean?isFirst()?{??
  59. return?(cursor2?==?-1);??
  60. public?Object?getNextItem()?{??
  61. return?products.get(cursor1);??
  62. ????}???
  63. ??????????
  64. public?Object?getPreviousItem()?{??
  65. return?products.get(cursor2);??
  66. ????}?????
  67. }??

?????? 编写如下客户端测试代码:

copy
    class?Client?{??
  1. static?void?main(String?args[])?{??
  2. ????????List?products?=?new?ArrayList();??
  3. ????????products.add("倚天剑");??
  4. ????????products.add("屠龙刀");??
  5. ????????products.add("断肠草");??
  6. ????????products.add("葵花宝典");??
  7. ????????products.add("四十二章经");??
  8. ??????????????
  9. ????????AbstractObjectList?list;??
  10. ????????AbstractIterator?iterator;??
  11. ??????????
  12. ????????list?=?new?ProductList(products);?//创建聚合对象??
  13. ????????iterator?=?list.createIterator();???//创建迭代器对象??
  14. ????????System.out.println("正向遍历:");??????
  15. while(!iterator.isLast())?{??
  16. ????????????System.out.print(iterator.getNextItem()?+?",");??
  17. ????????????iterator.next();??
  18. ????????}??
  19. ????????System.out.println();??
  20. ????????System.out.println("-----------------------------");??
  21. ????????System.out.println("逆向遍历:");??
  22. while(!iterator.isFirst())?{??
  23. ????????????System.out.print(iterator.getPreviousItem()?+?",");??
  24. ????????????iterator.previous();??
  25. }??

?????? 编译并运行程序,输出结果如下:

正向遍历:

倚天剑,屠龙刀,断肠草,葵花宝典,四十二章经,

-----------------------------

逆向遍历:

四十二章经,葵花宝典,断肠草,屠龙刀,倚天剑

?????? 如果需要增加一个新的具体聚合类,如客户数据集合类,并且需要为客户数据集合类提供不同于商品数据集合类的正向遍历和逆向遍历操作,只需增加一个新的聚合子类和一个新的具体迭代器类即可,原有类库代码无须修改,符合“开闭原则”;如果需要为ProductList类更换一个迭代器,只需要增加一个新的具体迭代器类作为抽象迭代器类的子类,重新实现遍历方法,原有迭代器代码无须修改,也符合“开闭原则”;但是如果要在迭代器中增加新的方法,则需要修改抽象迭代器源代码,这将违背“开闭原则”。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读