经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
设计模式之迭代器与组合模式(二)
来源:cnblogs  作者:小酒窝  时间:2019/6/19 8:58:39  对本文有异议

在上次的文章中,我们通过层层引导,已经知道了迭代器模式的由来。现在我们再好好总结下。

关于迭代器模式,你所需要知道的第一件事情,就是它依赖于一个名为迭代器的接口。这是一个可能的迭代器的接口:

现在,我们一旦有了这个接口,就可以为各种对象集合实现迭代器:数组、列表、散列表...如果我么想要为数组实现迭代器,以便使用在DinerMenu中,看起来就像这样:

在餐厅菜单中加入一个迭代器

想要在餐厅菜单中加入一个迭代器,我们需要先定义迭代器接口:

  1. public interface Iterator {
  2. boolean hasNext();
  3. Object next();
  4. }

现在我们需要实现一个具体的迭代器,为餐厅菜单服务:

  1. public class DinerMenuIterator implements Iterator {
  2. MenuItem[] items;
  3. int position = 0;
  4. public DinerMenuIterator(MenuItem[] items) {
  5. this.items = items;
  6. }
  7. public MenuItem next() {
  8. MenuItem menuItem = items[position];
  9. position = position + 1;
  10. return menuItem;
  11. }
  12. public boolean hasNext() {
  13. if (position >= items.length || items[position] == null) {
  14. return false;
  15. } else {
  16. return true;
  17. }
  18. }
  19. }

接下来,我们改写下餐厅菜单:

  1. public Iterator createIterator() {
  2. return new DinerMenuIterator(menuItems);
  3. // To test Alternating menu items, comment out above line,
  4. // and uncomment the line below.
  5. //return new AlternatingDinerMenuIterator(menuItems);
  6. }

我们需要将迭代器代码整合进服务员中。我们应该摆脱原本冗余的部分。整合的做法相当直接:首先创建一个printMenu()方法,传入一个迭代器当做此方法的参数,然后对每一个菜单都是用createIterator()方法来检索迭代器,并将迭代器传入新方法。

  1. public class Waitress {
  2. Menu pancakeHouseMenu;
  3. Menu dinerMenu;
  4. public Waitress(Menu pancakeHouseMenu, Menu dinerMenu) {
  5. this.pancakeHouseMenu = pancakeHouseMenu;
  6. this.dinerMenu = dinerMenu;
  7. }
  8. public void printMenu() {
  9. Iterator pancakeIterator = pancakeHouseMenu.createIterator();
  10. Iterator dinerIterator = dinerMenu.createIterator();
  11. System.out.println("MENU\n----\nBREAKFAST");
  12. printMenu(pancakeIterator);
  13. System.out.println("\nLUNCH");
  14. printMenu(dinerIterator);
  15. }
  16. private void printMenu(Iterator iterator) {
  17. while (iterator.hasNext()) {
  18. MenuItem menuItem = iterator.next();
  19. System.out.print(menuItem.getName() + ", ");
  20. System.out.print(menuItem.getPrice() + " -- ");
  21. System.out.println(menuItem.getDescription());
  22. }
  23. }
  24. // 此处省略其他方法
  25. }

熟悉Java的同学应该知道,其实Java有自带的迭代器接口。但是,我在这里为什么不这么做呢,是为了让我们更好地了解如何从头创建一个迭代器。现在目的达到了,所以就要改变做法,把之前自定义的迭代器改成Java的Iterator接口即可,在这里就不进行具体描述啦,详情请看源码即可。

定义迭代器模式

现在我们已经知道了如何用自己的迭代器来实现迭代器模式,也看到了Java是如何在某些面向聚合的类中(入ArrayList)支持迭代器的。现在我们就来看看这个模式真的正式定义:

迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内容的表示。

这个模式给你提供了一种方法,可以顺序访问一个聚集对象中的元素,而又不用知道内部是如何表示的。在设计中使用迭代器的影响是明显的:如果你有一个统一的方法访问聚合中的每一个对象,你就可以编写多态的代码和这些聚合搭配,使用--如同前面的printMenu()方法一样,只要有了迭代器这个方法根本不管菜单项究竟是有由数组还是ArrayList来保存的。

另一个对你设计造成重要影响的,是迭代器模式把元素之间游走的责任交给迭代器,而不是聚合对象。这不仅让聚合的接口和实现变得更简洁,也可以让聚合更专注在它所应该专注的事情上面,而不必去理会遍历的事情。

让我们检查类图,将来龙去脉拼凑出来

至此,迭代器模式我们就差不多都了解啦。但是,接下来,我们还会介绍组合模式,它为什么要和迭代器模式放在同一个章节里面呢?我们下回分晓。

爱生活,爱学习,爱感悟,爱挨踢

原文链接:http://www.cnblogs.com/dimple91/p/11044791.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号