java迭代器模式注意事项_迭代器模式 - JAVA知识总结与分享 - 博客园

迭代器模式

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

情节

有两家餐厅,共有两个菜单,两家准备合并,每个餐厅都有一个销售系统,但是内部菜单的组成结构稍有不同,一个是用数组存储菜单对象,一个是用集合存储菜单对象

需求

将两个菜单合并显示

两个菜单代码

数组菜单

1 packagecom.iteratorPattern.arr;2

3 importcom.iteratorPattern.vo.MenuItem;4

5 /**

6 * @program: test7 * @description: 数组菜单8 *@author: Mr.Yang9 * @create: 2019-01-01 15:2210 **/

11 public classArrMenu {12 static final int MAX_ITEMS=3;13 int items=0;14 MenuItem[] menuItems;15 publicArrMenu(){16 menuItems=newMenuItem[MAX_ITEMS];17 addItem("西红柿鸡蛋","有营养",10.00);18 addItem("酸辣白菜","好吃",11.00);19 addItem("酸辣土豆丝","特色菜",12.00);20 }21

22 private voidaddItem(String name,String description,Double price){23 MenuItem menuItem = newMenuItem(name, description, price);24 if(items>=MAX_ITEMS){25 System.err.println("menu is full,Can't add item to menu");26 }else{27 menuItems[items]=menuItem;28 items+=1;29 }30 }31

32 publicMenuItem[] getItems(){33 returnmenuItems;34 }35

36 }

list集合菜单

1 packagecom.iteratorPattern.list;2

3 importcom.iteratorPattern.vo.MenuItem;4

5 importjava.util.ArrayList;6

7 /**

8 * @program: test9 * @description: list集合菜单10 *@author: Mr.Yang11 * @create: 2019-01-01 15:3212 **/

13 public classListMenu {14 ArrayListmenuItems;15 publicListMenu(){16 menuItems = new ArrayList();17 addItem("紫菜鸡蛋汤","有营养的汤",6.00);18 addItem("豆腐脑","早餐必备",7.00);19 addItem("鱿鱼汤","补充大脑",8.00);20 }21

22

23 private voidaddItem(String name,String description,Double price){24 MenuItem menuItem = newMenuItem(name, description, price);25 menuItems.add(menuItem);26 }27

28 public ArrayListgetItems(){29 returnmenuItems;30 }31 }

当前合并测试类

1 packagecom.iteratorPattern.test;2

3 importcom.iteratorPattern.arr.ArrMenu;4 importcom.iteratorPattern.list.ListMenu;5 importcom.iteratorPattern.vo.MenuItem;6

7 importjava.util.ArrayList;8

9 /**

10 * @program: test11 * @description: 测试112 *@author: Mr.Yang13 * @create: 2019-01-01 15:3814 **/

15 public classTestOne {16 //打印菜单--菜类和汤类,需要遍历两次,如果再有一个会变成三次,四次…………

17 public static voidmain(String[] args) {18 ArrMenu arrMenu = newArrMenu();19 MenuItem[] items =arrMenu.getItems();20 for (int i = 0; i < items.length; i++) {21 MenuItem item =items[i];22 System.out.println("item name:"+item.getName());23 System.out.println("item description:"+item.getDescription());24 System.out.println("item price:"+item.getPrice());25 }26 ListMenu listMenu = newListMenu();27 ArrayList listMenuItems =listMenu.getItems();28 for (int i = 0; i < listMenuItems.size(); i++) {29 MenuItem item =(MenuItem) listMenuItems.get(i);30 System.out.println("item name:"+item.getName());31 System.out.println("item description:"+item.getDescription());32 System.out.println("item price:"+item.getPrice());33 }34 }35 }

整合后

创建迭代器

1 packagecom.iteratorPattern.Iterator;2

3 /**

4 * @program: test5 * @description: 迭代器接口6 *@author: Mr.Yang7 * @create: 2019-01-01 15:448 **/

9 public interfaceIterator {10 booleanhasNext();11 Object next();12 }

添加数组遍历方式的迭代器

1 packagecom.iteratorPattern.arr;2

3 importcom.iteratorPattern.Iterator.Iterator;4 importcom.iteratorPattern.vo.MenuItem;5

6 /**

7 * @program: test8 * @description: 数组遍历方式迭代器9 *@author: Mr.Yang10 * @create: 2019-01-01 15:4611 **/

12 public class ArrMenuIterator implementsIterator {13 MenuItem[] items;14 int position=0;15 publicArrMenuIterator(MenuItem[] items){16 this.items=items;17 }18

19 public booleanhasNext() {20 if(position>=items.length || items[position]==null){21 return false;22 }23 return true;24 }25

26 publicObject next() {27 MenuItem item =items[position];28 position+=1;29 returnitem;30 }31 }

数组菜单添加创建迭代器的方法

1 packagecom.iteratorPattern.arr;2

3 importcom.iteratorPattern.Iterator.Iterator;4 importcom.iteratorPattern.vo.MenuItem;5

6 /**

7 * @program: test8 * @description: 数组菜单9 *@author: Mr.Yang10 * @create: 2019-01-01 15:2211 **/

12 public classArrMenu {13 static final int MAX_ITEMS=3;14 int items=0;15 MenuItem[] menuItems;16 publicArrMenu(){17 menuItems=newMenuItem[MAX_ITEMS];18 addItem("西红柿鸡蛋","有营养",10.00);19 addItem("酸辣白菜","好吃",11.00);20 addItem("酸辣土豆丝","特色菜",12.00);21 }22

23 private voidaddItem(String name,String description,Double price){24 MenuItem menuItem = newMenuItem(name, description, price);25 if(items>=MAX_ITEMS){26 System.err.println("menu is full,Can't add item to menu");27 }else{28 menuItems[items]=menuItem;29 items+=1;30 }31 }32

33 publicIterator createIterator(){34 return newArrMenuIterator(menuItems);35 }36

37 }

创建list迭代器

1 packagecom.iteratorPattern.list;2

3 importcom.iteratorPattern.Iterator.Iterator;4 importcom.iteratorPattern.vo.MenuItem;5

6 importjava.util.ArrayList;7

8 /**

9 * @program: test10 * @description: list迭代器11 *@author: Mr.Yang12 * @create: 2019-01-01 16:1213 **/

14 public class ListMenuIterator implementsIterator {15 ArrayList listMenus;16 int position=0;17 publicListMenuIterator(ArrayList listMenus){18 this.listMenus=listMenus;19 }20

21 public booleanhasNext() {22 if(position>=listMenus.size() || listMenus.get(position)==null){23 return false;24 }25 return true;26 }27

28 publicObject next() {29 MenuItem menuItem =(MenuItem) listMenus.get(position);30 position+=1;31 returnmenuItem;32 }33 }

list集合菜单添加创建迭代器的方法

1 packagecom.iteratorPattern.list;2

3 importcom.iteratorPattern.Iterator.Iterator;4 importcom.iteratorPattern.vo.MenuItem;5

6 importjava.util.ArrayList;7

8 /**

9 * @program: test10 * @description: list集合菜单11 *@author: Mr.Yang12 * @create: 2019-01-01 15:3213 **/

14 public classListMenu {15 ArrayListmenuItems;16 publicListMenu(){17 menuItems = new ArrayList();18 addItem("紫菜鸡蛋汤","有营养的汤",6.00);19 addItem("豆腐脑","早餐必备",7.00);20 addItem("鱿鱼汤","补充大脑",8.00);21 }22

23

24 private voidaddItem(String name,String description,Double price){25 MenuItem menuItem = newMenuItem(name, description, price);26 menuItems.add(menuItem);27 }28 publicIterator createIterator(){29 return newListMenuIterator(menuItems);30 }31 }

测试

1 packagecom.iteratorPattern.test;2

3 importcom.iteratorPattern.Iterator.Iterator;4 importcom.iteratorPattern.arr.ArrMenu;5 importcom.iteratorPattern.list.ListMenu;6 importcom.iteratorPattern.vo.MenuItem;7

8 /**

9 * @program: test10 * @description: 测试211 *@author: Mr.Yang12 * @create: 2019-01-01 16:1713 **/

14 public classTestTwo {15 public static voidmain(String[] args) {16 ArrMenu arrMenu = newArrMenu();17 ListMenu listMenu = newListMenu();18 System.out.println("---------------数组 菜类---------------");19 printMenu(arrMenu.createIterator());20 System.out.println("---------------集合 汤类---------------");21 printMenu(listMenu.createIterator());22 }23 private static voidprintMenu(Iterator iterator){24 while(iterator.hasNext()){25 MenuItem next =(MenuItem) iterator.next();26 System.out.println("menu name is :"+next.getName());27 System.out.println("menu description is :"+next.getDescription());28 System.out.println("menu price is :"+next.getPrice());29 }30 }31 }

测试结果

1 ---------------数组 菜类---------------

2 menu name is :西红柿鸡蛋3 menu description is :有营养4 menu price is :10.0

5 menu name is :酸辣白菜6 menu description is :好吃7 menu price is :11.0

8 menu name is :酸辣土豆丝9 menu description is :特色菜10 menu price is :12.0

11 ---------------集合 汤类---------------

12 menu name is :紫菜鸡蛋汤13 menu description is :有营养的汤14 menu price is :6.0

15 menu name is :豆腐脑16 menu description is :早餐必备17 menu price is :7.0

18 menu name is :鱿鱼汤19 menu description is :补充大脑20 menu price is :8.0

说明

此处不用java.util下面的迭代器是为了更好的了解迭代器是如何工作的,java.util比我们所实现的迭代器多了一个remove方法,如果有其他需求,自定义的迭代器相比于java.util更易拓展。

祝福

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值