假如你现在还在为自己的技术担忧,假如你现在想提升自己的工资,假如你想在职场上获得更多的话语权,假如你想顺利的度过35岁这个魔咒,假如你想体验BAT的工作环境,那么现在请我们一起开启提升技术之旅吧,详情请点击http://106.12.206.16:8080/qingruihappy/index.html
迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。
迭代器模式属于行为型模式。
介绍
意图:提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示。
主要解决:不同的方式来遍历整个整合对象。
何时使用:遍历一个聚合对象。
如何解决:把在元素之间游走的责任交给迭代器,而不是聚合对象。
关键代码:定义接口:hasNext, next。
应用实例:JAVA 中的 iterator。
优点: 1、它支持以不同的方式遍历一个聚合对象。 2、迭代器简化了聚合类。 3、在同一个聚合上可以有多个遍历。 4、在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。
缺点:由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。
使用场景: 1、访问一个聚合对象的内容而无须暴露它的内部表示。 2、需要为聚合对象提供多种遍历方式。 3、为遍历不同的聚合结构提供一个统一的接口。
注意事项:迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。
案例一:
Iterator接口
package com.DesignPatterns.aj.iterator1; public interface Iterator { boolean hasNext(); Object next(); }
MenuItem实体类
1 package com.DesignPatterns.aj.iterator1; 2 3 public class MenuItem { 4 String name; 5 String description; 6 boolean vegetarian; 7 double price; 8 9 public MenuItem(String name, 10 String description, 11 boolean vegetarian, 12 double price) 13 { 14 this.name = name; 15 this.description = description; 16 this.vegetarian = vegetarian; 17 this.price = price; 18 } 19 20 public String getName() { 21 return name; 22 } 23 24 public String getDescription() { 25 return description; 26 } 27 28 public double getPrice() { 29 return price; 30 } 31 32 public boolean isVegetarian() { 33 return vegetarian; 34 } 35 public String toString() { 36 return (name + ", $" + price + "\n " + description); 37 } 38 }
DinerMenu实例1数组
1 package com.DesignPatterns.aj.iterator1; 2 3 public class DinerMenu { 4 static final int MAX_ITEMS = 6; 5 int numberOfItems = 0; 6 MenuItem[] menuItems; 7 8 public DinerMenu() { 9 menuItems = new MenuItem[MAX_ITEMS]; 10 11 addItem("数组晚餐1.1:", 12 "大米", true, 2.99); 13 addItem("数组晚餐1.2:", 14 "白面", true, 2.99); 15 addItem("数组晚餐1.3:", 16 "火锅", true, 3.29); 17 18 19 } 20 21 public void addItem(String name, String description, 22 boolean vegetarian, double price) 23 { 24 MenuItem menuItem = new MenuItem(name, description, vegetarian, price); 25 if (numberOfItems >= MAX_ITEMS) { 26 System.err.println("Sorry, menu is full! Can't add item to menu"); 27 } else { 28 menuItems[numberOfItems] = menuItem; 29 numberOfItems = numberOfItems + 1; 30 } 31 } 32 33 public MenuItem[] getMenuItems() { 34 return menuItems; 35 } 36 37 public Iterator createIterator() { 38 return new DinerMenuIterator(menuItems); 39 } 40 41 // other menu methods here 42 }
DinerMenu实例1的迭代器DinerMenuIterator
1 package com.DesignPatterns.aj.iterator1; 2 3 public class DinerMenuIterator implements Iterator { 4 MenuItem[] items; 5 int position = 0; 6 7 public DinerMenuIterator(MenuItem[] items) { 8 this.items = items; 9 } 10 11 public Object next() { 12 MenuItem menuItem = items[position]; 13 position = position + 1; 14 return menuItem; 15 } 16 17 public boolean hasNext() { 18 if (position >= items.length || items[position] == null) { 19 return false; 20 } else { 21 return true; 22 } 23 } 24 }
PancakeHouseMenu实例2集合
1 package com.DesignPatterns.aj.iterator1; 2 3 import java.util.ArrayList; 4 5 public class PancakeHouseMenu { 6 ArrayList menuItems; 7 8 public PancakeHouseMenu() { 9 menuItems = new ArrayList(); 10 11 addItem("集合2.1,早餐", 12 "玉米粥", 13 true, 14 2.99); 15 16 addItem("集合2.2,早餐", 17 "大米粥", 18 true, 19 2.99); 20 21 addItem("集合2.3,早餐", 22 "小米粥", 23 true, 24 3.49); 25 26 27 } 28 29 public void addItem(String name, String description, 30 boolean vegetarian, double price) 31 { 32 MenuItem menuItem = new MenuItem(name, description, vegetarian, price); 33 menuItems.add(menuItem); 34 } 35 36 public ArrayList getMenuItems() { 37 return menuItems; 38 } 39 40 public Iterator createIterator() { 41 return new PancakeHouseMenuIterator(menuItems); 42 } 43 44 public String toString() { 45 return "Objectville Pancake House Menu"; 46 } 47 48 // other menu methods here 49 }
PancakeHouseMenu实例2集合的迭代器
1 package com.DesignPatterns.aj.iterator1; 2 3 import java.util.ArrayList; 4 5 public class PancakeHouseMenuIterator implements Iterator { 6 ArrayList items; 7 int position = 0; 8 9 public PancakeHouseMenuIterator(ArrayList items) { 10 this.items = items; 11 } 12 13 public Object next() { 14 Object object = items.get(position); 15 position = position + 1; 16 return object; 17 } 18 19 public boolean hasNext() { 20 if (position >= items.size()) { 21 return false; 22 } else { 23 return true; 24 } 25 } 26 }
1 package com.DesignPatterns.aj.iterator1; 2 3 import java.util.*; 4 5 public class MenuTestDrive { 6 public static void main(String args[]) { 7 //集合 8 PancakeHouseMenu pancakeHouseMenu = new PancakeHouseMenu(); 9 //数组 10 DinerMenu dinerMenu = new DinerMenu(); 11 12 Waitress waitress = new Waitress(pancakeHouseMenu, dinerMenu); 13 14 waitress.printMenu(); 15 } 16 17 }
集合2.1,早餐, 2.99 -- 玉米粥 集合2.2,早餐, 2.99 -- 大米粥 集合2.3,早餐, 3.49 -- 小米粥 数组晚餐1.1:, 2.99 -- 大米 数组晚餐1.2:, 2.99 -- 白面 数组晚餐1.3:, 3.29 -- 火锅
案例二:
Menu统一的接口
1 package com.DesignPatterns.aj.iterator3; 2 3 import java.util.Iterator; 4 5 public interface Menu { 6 public Iterator createIterator(); 7 }
MenuItem实体类
1 package com.DesignPatterns.aj.iterator3; 2 3 public class MenuItem { 4 String name; 5 String description; 6 boolean vegetarian; 7 double price; 8 9 public MenuItem(String name, 10 String description, 11 boolean vegetarian, 12 double price) 13 { 14 this.name = name; 15 this.description = description; 16 this.vegetarian = vegetarian; 17 this.price = price; 18 } 19 20 public String getName() { 21 return name; 22 } 23 24 public String getDescription() { 25 return description; 26 } 27 28 public double getPrice() { 29 return price; 30 } 31 32 public boolean isVegetarian() { 33 return vegetarian; 34 } 35 }
DinerMenu
1 package com.DesignPatterns.aj.iterator3; 2 3 import java.util.Iterator; 4 5 public class DinerMenu implements Menu { 6 static final int MAX_ITEMS = 6; 7 int numberOfItems = 0; 8 MenuItem[] menuItems; 9 10 public DinerMenu() { 11 menuItems = new MenuItem[MAX_ITEMS]; 12 13 14 addItem("数组晚餐1.1:", 15 "大米", true, 2.99); 16 addItem("数组晚餐1.2:", 17 "白面", true, 2.99); 18 addItem("数组晚餐1.3:", 19 "火锅", true, 3.29); 20 } 21 22 public void addItem(String name, String description, 23 boolean vegetarian, double price) 24 { 25 MenuItem menuItem = new MenuItem(name, description, vegetarian, price); 26 if (numberOfItems >= MAX_ITEMS) { 27 System.err.println("Sorry, menu is full! Can't add item to menu"); 28 } else { 29 menuItems[numberOfItems] = menuItem; 30 numberOfItems = numberOfItems + 1; 31 } 32 } 33 34 public MenuItem[] getMenuItems() { 35 return menuItems; 36 } 37 38 public Iterator createIterator() { 39 return new DinerMenuIterator(menuItems); 40 } 41 42 }
DinerMenuIterator
1 package com.DesignPatterns.aj.iterator3; 2 3 import java.util.Iterator; 4 5 public class DinerMenuIterator implements Iterator {//这里的Iterrator是jdk自带的 6 MenuItem[] list; 7 int position = 0; 8 9 public DinerMenuIterator(MenuItem[] list) { 10 this.list = list; 11 } 12 13 public Object next() { 14 MenuItem menuItem = list[position]; 15 position = position + 1; 16 return menuItem; 17 } 18 19 public boolean hasNext() { 20 if (position >= list.length || list[position] == null) { 21 return false; 22 } else { 23 return true; 24 } 25 } 26 27 public void remove() { 28 if (position <= 0) { 29 throw new IllegalStateException 30 ("You can't remove an item until you've done at least one next()"); 31 } 32 if (list[position-1] != null) { 33 for (int i = position-1; i < (list.length-1); i++) { 34 list[i] = list[i+1]; 35 } 36 list[list.length-1] = null; 37 } 38 } 39 }
PancakeHouseMenu
1 package com.DesignPatterns.aj.iterator3; 2 3 import java.util.ArrayList; 4 import java.util.Iterator; 5 6 public class PancakeHouseMenu implements Menu { 7 ArrayList menuItems; 8 9 public PancakeHouseMenu() { 10 menuItems = new ArrayList(); 11 12 addItem("集合2.1,早餐", 13 "玉米粥", 14 true, 15 2.99); 16 17 addItem("集合2.2,早餐", 18 "大米粥", 19 true, 20 2.99); 21 22 addItem("集合2.3,早餐", 23 "小米粥", 24 true, 25 3.49); 26 27 } 28 29 public void addItem(String name, String description, 30 boolean vegetarian, double price) 31 { 32 MenuItem menuItem = new MenuItem(name, description, vegetarian, price); 33 menuItems.add(menuItem); 34 } 35 36 public ArrayList getMenuItems() { 37 return menuItems; 38 } 39 40 public Iterator createIterator() { 41 return menuItems.iterator();//这里用的是jdk的list的迭代器 42 } 43 44 }
Waitress
1 package com.DesignPatterns.aj.iterator3; 2 3 import java.util.Iterator; 4 5 public class Waitress { 6 Menu pancakeHouseMenu; 7 Menu dinerMenu; 8 9 public Waitress(Menu pancakeHouseMenu, Menu dinerMenu) { 10 this.pancakeHouseMenu = pancakeHouseMenu; 11 this.dinerMenu = dinerMenu; 12 } 13 14 public void printMenu() { 15 Iterator pancakeIterator = pancakeHouseMenu.createIterator(); 16 Iterator dinerIterator = dinerMenu.createIterator(); 17 18 printMenu(pancakeIterator); 19 printMenu(dinerIterator); 20 } 21 22 private void printMenu(Iterator iterator) { 23 while (iterator.hasNext()) { 24 MenuItem menuItem = (MenuItem) iterator.next(); 25 System.out.print(menuItem.getName() + ", "); 26 System.out.print(menuItem.getPrice() + " -- "); 27 System.out.println(menuItem.getDescription()); 28 } 29 } 30 31 }
MenuTestDrive
1 package com.DesignPatterns.aj.iterator3; 2 3 import java.util.*; 4 5 public class MenuTestDrive { 6 public static void main(String args[]) { 7 PancakeHouseMenu pancakeHouseMenu = new PancakeHouseMenu(); 8 DinerMenu dinerMenu = new DinerMenu(); 9 Waitress waitress = new Waitress(pancakeHouseMenu, dinerMenu); 10 waitress.printMenu(); 11 12 13 } 14 }
集合2.1,早餐, 2.99 -- 玉米粥 集合2.2,早餐, 2.99 -- 大米粥 集合2.3,早餐, 3.49 -- 小米粥 数组晚餐1.1:, 2.99 -- 大米 数组晚餐1.2:, 2.99 -- 白面 数组晚餐1.3:, 3.29 -- 火锅
案例三:
假如我们现在还需要一个map 的迭代器,现在改怎么办呢
CafeMenu
1 package com.DesignPatterns.aj.iterator2; 2 3 import java.util.*; 4 5 public class CafeMenu implements Menu { 6 Hashtable menuItems = new Hashtable(); 7 8 public CafeMenu() { 9 addItem("map3.1午饭", 10 "鸡肉", 11 true, 3.99); 12 addItem("map3.2午饭", 13 "鸭肉", 14 false, 3.69); 15 addItem("map3.3午饭", 16 "鱼肉", 17 true, 4.29); 18 } 19 20 public void addItem(String name, String description, 21 boolean vegetarian, double price) 22 { 23 MenuItem menuItem = new MenuItem(name, description, vegetarian, price); 24 menuItems.put(menuItem.getName(), menuItem); 25 } 26 27 public Hashtable getItems() { 28 return menuItems; 29 } 30 31 public Iterator createIterator() { 32 return menuItems.values().iterator();//这里用的是map中jdk自带的迭代器 33 } 34 }
Waitress
1 package com.DesignPatterns.aj.iterator2; 2 3 import java.util.Iterator; 4 5 public class Waitress { 6 Menu pancakeHouseMenu; 7 Menu dinerMenu; 8 Menu cafeMenu; 9 10 public Waitress(Menu pancakeHouseMenu, Menu dinerMenu, Menu cafeMenu) { 11 this.pancakeHouseMenu = pancakeHouseMenu; 12 this.dinerMenu = dinerMenu; 13 this.cafeMenu = cafeMenu; 14 } 15 16 public void printMenu() { 17 Iterator pancakeIterator = pancakeHouseMenu.createIterator(); 18 Iterator dinerIterator = dinerMenu.createIterator(); 19 Iterator cafeIterator = cafeMenu.createIterator(); 20 21 System.out.println("MENU\n----\nBREAKFAST"); 22 printMenu(pancakeIterator); 23 System.out.println("\nLUNCH"); 24 printMenu(dinerIterator); 25 System.out.println("\nDINNER"); 26 printMenu(cafeIterator); 27 } 28 29 private void printMenu(Iterator iterator) { 30 while (iterator.hasNext()) { 31 MenuItem menuItem = (MenuItem)iterator.next(); 32 System.out.print(menuItem.getName() + ", "); 33 System.out.print(menuItem.getPrice() + " -- "); 34 System.out.println(menuItem.getDescription()); 35 } 36 } 37 38 public void printVegetarianMenu() { 39 System.out.println("\nVEGETARIAN MENU\n---------------"); 40 printVegetarianMenu(pancakeHouseMenu.createIterator()); 41 printVegetarianMenu(dinerMenu.createIterator()); 42 printVegetarianMenu(cafeMenu.createIterator()); 43 } 44 45 public boolean isItemVegetarian(String name) { 46 Iterator pancakeIterator = pancakeHouseMenu.createIterator(); 47 if (isVegetarian(name, pancakeIterator)) { 48 return true; 49 } 50 Iterator dinerIterator = dinerMenu.createIterator(); 51 if (isVegetarian(name, dinerIterator)) { 52 return true; 53 } 54 Iterator cafeIterator = cafeMenu.createIterator(); 55 if (isVegetarian(name, cafeIterator)) { 56 return true; 57 } 58 return false; 59 } 60 61 62 private void printVegetarianMenu(Iterator iterator) { 63 while (iterator.hasNext()) { 64 MenuItem menuItem = (MenuItem)iterator.next(); 65 if (menuItem.isVegetarian()) { 66 System.out.print(menuItem.getName() + ", "); 67 System.out.print(menuItem.getPrice() + " -- "); 68 System.out.println(menuItem.getDescription()); 69 } 70 } 71 } 72 73 private boolean isVegetarian(String name, Iterator iterator) { 74 while (iterator.hasNext()) { 75 MenuItem menuItem = (MenuItem)iterator.next(); 76 if (menuItem.getName().equals(name)) { 77 if (menuItem.isVegetarian()) { 78 return true; 79 } 80 } 81 } 82 return false; 83 } 84 } 85 //^^ WaitressCafeMain 86 //^^ WaitressCafe
MenuTestDrive
1 package com.DesignPatterns.aj.iterator2; 2 3 import java.util.*; 4 5 public class MenuTestDrive { 6 public static void main(String args[]) { 7 PancakeHouseMenu pancakeHouseMenu = new PancakeHouseMenu(); 8 DinerMenu dinerMenu = new DinerMenu(); 9 CafeMenu cafeMenu = new CafeMenu(); 10 11 Waitress waitress = new Waitress(pancakeHouseMenu, dinerMenu, cafeMenu); 12 13 waitress.printMenu(); 14 15 } 16 }
1 MENU 2 ---- 3 BREAKFAST 4 集合2.1,早餐, 2.99 -- 玉米粥 5 集合2.2,早餐, 2.99 -- 大米粥 6 集合2.3,早餐, 3.49 -- 小米粥 7 8 LUNCH 9 数组晚餐1.1:, 2.99 -- 大米 10 数组晚餐1.2:, 2.99 -- 白面 11 数组晚餐1.3:, 3.29 -- 火锅 12 13 DINNER 14 map3.2午饭, 3.69 -- 鸭肉 15 map3.1午饭, 3.99 -- 鸡肉 16 map3.3午饭, 4.29 -- 鱼肉
案例四:最后我们来看一下jdk自带的用法
Menu
1 package com.DesignPatterns.aj.iterator4; 2 3 import java.util.Iterator; 4 5 public interface Menu { 6 public Iterator createIterator(); 7 }
MenuItem
1 package com.DesignPatterns.aj.iterator4; 2 3 public class MenuItem { 4 String name; 5 String description; 6 boolean vegetarian; 7 double price; 8 9 public MenuItem(String name, 10 String description, 11 boolean vegetarian, 12 double price) 13 { 14 this.name = name; 15 this.description = description; 16 this.vegetarian = vegetarian; 17 this.price = price; 18 } 19 20 public String getName() { 21 return name; 22 } 23 24 public String getDescription() { 25 return description; 26 } 27 28 public double getPrice() { 29 return price; 30 } 31 32 public boolean isVegetarian() { 33 return vegetarian; 34 } 35 }
Waitress
1 package com.DesignPatterns.aj.iterator4; 2 import java.util.*; 3 4 5 public class Waitress { 6 ArrayList menus; 7 8 9 public Waitress(ArrayList menus) { 10 this.menus = menus; 11 } 12 13 public void printMenu() { 14 Iterator menuIterator = menus.iterator(); 15 while(menuIterator.hasNext()) { 16 Menu menu = (Menu)menuIterator.next(); 17 printMenu(menu.createIterator()); 18 } 19 } 20 21 void printMenu(Iterator iterator) { 22 while (iterator.hasNext()) { 23 MenuItem menuItem = (MenuItem)iterator.next(); 24 System.out.print(menuItem.getName() + ", "); 25 System.out.print(menuItem.getPrice() + " -- "); 26 System.out.println(menuItem.getDescription()); 27 } 28 } 29 }
假如你现在还在为自己的技术担忧,假如你现在想提升自己的工资,假如你想在职场上获得更多的话语权,假如你想顺利的度过35岁这个魔咒,假如你想体验BAT的工作环境,那么现在请我们一起开启提升技术之旅吧,详情请点击http://106.12.206.16:8080/qingruihappy/index.html