设计模式(19)-----行为型模式-----迭代器设计模式

假如你现在还在为自己的技术担忧,假如你现在想提升自己的工资,假如你想在职场上获得更多的话语权,假如你想顺利的度过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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值