栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java设计模式之迭代器模式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java设计模式之迭代器模式

迭代器模式 定义

以下引用来自于《head first 设计模式》第九章

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

优越点

以下引用来自于参考1

迭代器模式是一种对象行为型模式,其主要优点如下。

  1. 访问一个聚合对象的内容而无须暴露它的内部表示。
  2. 遍历任务交由迭代器完成,这简化了聚合类。
  3. 它支持以不同方式遍历一个聚合,甚至可以自定义迭代器的子类以支持新的遍历。
  4. 增加新的聚合类和迭代器类都很方便,无须修改原有代码。
  5. 封装性良好,为遍历不同的聚合结构提供一个统一的接口。

其主要缺点是:增加了类的个数,这在一定程度上增加了系统的复杂性。

使用场景

以下引用来自于参考1

迭代器模式通常在以下几种情况使用。

  1. 当需要为聚合对象提供多种遍历方式时。
  2. 当需要为遍历不同的聚合结构提供一个统一的接口时。
  3. 当访问一个聚合对象的内容而无须暴露其内部细节的表示时。
示例

迭代器接口

public interface Iterator {
   boolean hasNext();
   MenuItem next();
}

煎饼屋菜单迭代器

public class PancakeHouseMenuIterator implements Iterator {
   ArrayList items;
   int position = 0;
 
   public PancakeHouseMenuIterator(ArrayList items) {
      this.items = items;
   }
 
   public String next() {
      String menuItem = (String) items.get(position);
      position = position + 1;
      return menuItem;
   }
 
   public boolean hasNext() {
      if (position >= items.size()) {
         return false;
      } else {
         return true;
      }
   }
}

晚餐菜单迭代器

public class DinerMenuIterator implements Iterator {
   String[] items;
   int position = 0;
 
   public DinerMenuIterator(String[] items) {
      this.items = items;
   }
 
   public String next() {
      String menuItem = items[position];
      position = position + 1;
      return menuItem;
   }
 
   public boolean hasNext() {
      if (position >= items.length || items[position] == null) {
         return false;
      } else {
         return true;
      }
   }
}

调用遍历

public class Cafe {

   public static void main(String args[]) {
      PancakeHouseMenu pancakeHouseMenu = new PancakeHouseMenu();
      DinerMenu dinerMenu = new DinerMenu();
      
      // with no iterators
      System.out.println("nMENUn----nBREAKFAST");
      ArrayList breakfastItems = pancakeHouseMenu.getMenuItems();
      for (int i = 0; i < breakfastItems.size(); i++) {
         String menuItem = (String)breakfastItems.get(i);
         System.out.println(menuItem);
      }

      System.out.println("nLUNCH");
      String[] lunchItems = dinerMenu.getMenuItems();

      for (int i = 0; i < lunchItems.length; i++) {
         String menuItem = lunchItems[i];
         System.out.println(menuItem);
      }
      
      // with iterators
      Iterator pancakeIterator = pancakeHouseMenu.createIterator();
      Iterator dinerIterator = dinerMenu.createIterator();

      System.out.println("nMENU (with iterators)n----nBREAKFAST");
      printMenu(pancakeIterator);
      System.out.println("nLUNCH");
      printMenu(dinerIterator); 
   }
 
   private static void printMenu(Iterator iterator) {
      while (iterator.hasNext()) {
         String menuItem = (String)iterator.next();
         System.out.println(menuItem);

      }
   }
}
参考

1迭代器模式(详解版)

2《head first 设计模式》

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/353716.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号