迭代器模式
时间:2022-06-24
本文章向大家介绍迭代器模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
迭代器模式 提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示
情节
有两家餐厅,共有两个菜单,两家准备合并,每个餐厅都有一个销售系统,但是内部菜单的组成结构稍有不同,一个是用数组存储菜单对象,一个是用集合存储菜单对象
需求
将两个菜单合并显示
两个菜单代码
数组菜单
package com.iteratorPattern.arr;
import com.iteratorPattern.vo.MenuItem;
/**
* @program: test
* @description: 数组菜单
* @author: Mr.Yang
* @create: 2019-01-01 15:22
**/
public class ArrMenu {
static final int MAX_ITEMS=3;
int items=0;
MenuItem[] menuItems;
public ArrMenu(){
menuItems=new MenuItem[MAX_ITEMS];
addItem("西红柿鸡蛋","有营养",10.00);
addItem("酸辣白菜","好吃",11.00);
addItem("酸辣土豆丝","特色菜",12.00);
}
private void addItem(String name,String description,Double price){
MenuItem menuItem = new MenuItem(name, description, price);
if(items>=MAX_ITEMS){
System.err.println("menu is full,Can't add item to menu");
}else{
menuItems[items]=menuItem;
items+=1;
}
}
public MenuItem[] getItems(){
return menuItems;
}
}
list集合菜单
package com.iteratorPattern.list;
import com.iteratorPattern.vo.MenuItem;
import java.util.ArrayList;
/**
* @program: test
* @description: list集合菜单
* @author: Mr.Yang
* @create: 2019-01-01 15:32
**/
public class ListMenu {
ArrayList<MenuItem> menuItems;
public ListMenu(){
menuItems = new ArrayList<MenuItem>();
addItem("紫菜鸡蛋汤","有营养的汤",6.00);
addItem("豆腐脑","早餐必备",7.00);
addItem("鱿鱼汤","补充大脑",8.00);
}
private void addItem(String name,String description,Double price){
MenuItem menuItem = new MenuItem(name, description, price);
menuItems.add(menuItem);
}
public ArrayList<MenuItem> getItems(){
return menuItems;
}
}
当前合并测试类
package com.iteratorPattern.test;
import com.iteratorPattern.arr.ArrMenu;
import com.iteratorPattern.list.ListMenu;
import com.iteratorPattern.vo.MenuItem;
import java.util.ArrayList;
/**
* @program: test
* @description: 测试1
* @author: Mr.Yang
* @create: 2019-01-01 15:38
**/
public class TestOne {
//打印菜单--菜类和汤类,需要遍历两次,如果再有一个会变成三次,四次…………
public static void main(String[] args) {
ArrMenu arrMenu = new ArrMenu();
MenuItem[] items = arrMenu.getItems();
for (int i = 0; i < items.length; i++) {
MenuItem item = items[i];
System.out.println("item name:"+item.getName());
System.out.println("item description:"+item.getDescription());
System.out.println("item price:"+item.getPrice());
}
ListMenu listMenu = new ListMenu();
ArrayList listMenuItems = listMenu.getItems();
for (int i = 0; i < listMenuItems.size(); i++) {
MenuItem item = (MenuItem) listMenuItems.get(i);
System.out.println("item name:"+item.getName());
System.out.println("item description:"+item.getDescription());
System.out.println("item price:"+item.getPrice());
}
}
}
整合后
创建迭代器
package com.iteratorPattern.Iterator;
/**
* @program: test
* @description: 迭代器接口
* @author: Mr.Yang
* @create: 2019-01-01 15:44
**/
public interface Iterator {
boolean hasNext();
Object next();
}
添加数组遍历方式的迭代器
package com.iteratorPattern.arr;
import com.iteratorPattern.Iterator.Iterator;
import com.iteratorPattern.vo.MenuItem;
/**
* @program: test
* @description: 数组遍历方式迭代器
* @author: Mr.Yang
* @create: 2019-01-01 15:46
**/
public class ArrMenuIterator implements Iterator {
MenuItem[] items;
int position=0;
public ArrMenuIterator(MenuItem[] items){
this.items=items;
}
public boolean hasNext() {
if(position>=items.length || items[position]==null){
return false;
}
return true;
}
public Object next() {
MenuItem item = items[position];
position+=1;
return item;
}
}
数组菜单添加创建迭代器的方法
package com.iteratorPattern.arr;
import com.iteratorPattern.Iterator.Iterator;
import com.iteratorPattern.vo.MenuItem;
/**
* @program: test
* @description: 数组菜单
* @author: Mr.Yang
* @create: 2019-01-01 15:22
**/
public class ArrMenu {
static final int MAX_ITEMS=3;
int items=0;
MenuItem[] menuItems;
public ArrMenu(){
menuItems=new MenuItem[MAX_ITEMS];
addItem("西红柿鸡蛋","有营养",10.00);
addItem("酸辣白菜","好吃",11.00);
addItem("酸辣土豆丝","特色菜",12.00);
}
private void addItem(String name,String description,Double price){
MenuItem menuItem = new MenuItem(name, description, price);
if(items>=MAX_ITEMS){
System.err.println("menu is full,Can't add item to menu");
}else{
menuItems[items]=menuItem;
items+=1;
}
}
public Iterator createIterator(){
return new ArrMenuIterator(menuItems);
}
}
创建list迭代器
package com.iteratorPattern.list;
import com.iteratorPattern.Iterator.Iterator;
import com.iteratorPattern.vo.MenuItem;
import java.util.ArrayList;
/**
* @program: test
* @description: list迭代器
* @author: Mr.Yang
* @create: 2019-01-01 16:12
**/
public class ListMenuIterator implements Iterator {
ArrayList listMenus;
int position=0;
public ListMenuIterator(ArrayList listMenus){
this.listMenus=listMenus;
}
public boolean hasNext() {
if(position>=listMenus.size() || listMenus.get(position)==null){
return false;
}
return true;
}
public Object next() {
MenuItem menuItem = (MenuItem) listMenus.get(position);
position+=1;
return menuItem;
}
}
list集合菜单添加创建迭代器的方法
package com.iteratorPattern.list;
import com.iteratorPattern.Iterator.Iterator;
import com.iteratorPattern.vo.MenuItem;
import java.util.ArrayList;
/**
* @program: test
* @description: list集合菜单
* @author: Mr.Yang
* @create: 2019-01-01 15:32
**/
public class ListMenu {
ArrayList<MenuItem> menuItems;
public ListMenu(){
menuItems = new ArrayList<MenuItem>();
addItem("紫菜鸡蛋汤","有营养的汤",6.00);
addItem("豆腐脑","早餐必备",7.00);
addItem("鱿鱼汤","补充大脑",8.00);
}
private void addItem(String name,String description,Double price){
MenuItem menuItem = new MenuItem(name, description, price);
menuItems.add(menuItem);
}
public Iterator createIterator(){
return new ListMenuIterator(menuItems);
}
}
测试
package com.iteratorPattern.test;
import com.iteratorPattern.Iterator.Iterator;
import com.iteratorPattern.arr.ArrMenu;
import com.iteratorPattern.list.ListMenu;
import com.iteratorPattern.vo.MenuItem;
/**
* @program: test
* @description: 测试2
* @author: Mr.Yang
* @create: 2019-01-01 16:17
**/
public class TestTwo {
public static void main(String[] args) {
ArrMenu arrMenu = new ArrMenu();
ListMenu listMenu = new ListMenu();
System.out.println("---------------数组 菜类---------------");
printMenu(arrMenu.createIterator());
System.out.println("---------------集合 汤类---------------");
printMenu(listMenu.createIterator());
}
private static void printMenu(Iterator iterator){
while (iterator.hasNext()){
MenuItem next = (MenuItem) iterator.next();
System.out.println("menu name is :"+next.getName());
System.out.println("menu description is :"+next.getDescription());
System.out.println("menu price is :"+next.getPrice());
}
}
}
测试结果
---------------数组 菜类---------------
menu name is :西红柿鸡蛋
menu description is :有营养
menu price is :10.0
menu name is :酸辣白菜
menu description is :好吃
menu price is :11.0
menu name is :酸辣土豆丝
menu description is :特色菜
menu price is :12.0
---------------集合 汤类---------------
menu name is :紫菜鸡蛋汤
menu description is :有营养的汤
menu price is :6.0
menu name is :豆腐脑
menu description is :早餐必备
menu price is :7.0
menu name is :鱿鱼汤
menu description is :补充大脑
menu price is :8.0
说明
此处不用java.util下面的迭代器是为了更好的了解迭代器是如何工作的,java.util比我们所实现的迭代器多了一个remove方法,如果有其他需求,自定义的迭代器相比于java.util更易拓展。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 10行Python代码自动清理电脑内重复文件,解放双手!
- 【一天一大 lee】二叉树的后序遍历 (难度:中等) - Day20200929
- 一日一技:在Golang下如何相对简单地开发爬虫?
- 原创 | 一文读懂正态分布与贝塔分布
- 收款神器!解读聚合收款码背后的原理
- 短视频商城源码,滑动时渐变效果实现
- CICD实战——服务自动测试
- MySQL 案例:left join 与 BUG
- WordPress缩略图出现A TimThumb error has occured解决办法
- 2020-09-30:谈谈内存对齐。
- leetcode树之对称二叉树
- 【网络技术联盟站】网络安全 | 瑞哥带你全方位解读防火墙技术!
- 腾讯云服务器CVM+CentOS,部署LAMP环境快速搭建WordPress博客
- leetcode栈之有效的括号
- JSON Web Token 的结构是什么