前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >迭代器模式

迭代器模式

作者头像
杨小杰
发布于 2019-07-04 08:30:17
发布于 2019-07-04 08:30:17
58500
代码可运行
举报
运行总次数:0
代码可运行

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

情节

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

需求

将两个菜单合并显示

两个菜单代码

数组菜单

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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集合菜单

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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;
    }
}

当前合并测试类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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());
        }
    }
}

整合后

创建迭代器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.iteratorPattern.Iterator;

/**
 * @program: test
 * @description: 迭代器接口
 * @author: Mr.Yang
 * @create: 2019-01-01 15:44
 **/
public interface Iterator {
    boolean hasNext();
    Object next();
}

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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;
    }
}

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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迭代器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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集合菜单添加创建迭代器的方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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);
    }
}

测试

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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());
        }
    }
}

测试结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
---------------数组 菜类---------------
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更易拓展。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-01-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 JAVA知识总结与分享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
设计模式-迭代器模式
迭代器模式(Iterator Pattern)是一种行为型设计模式,它可以让我们在不暴露对象实现细节的情况下,访问一个聚合对象中的每一个元素,而无需暴露其内部结构。迭代器模式通过将聚合对象的遍历操作委托给一个迭代器对象来实现这一目标。迭代器模式提供了一种标准的遍历方式,使得我们可以在不改变聚合对象代码的情况下,实现对聚合对象的不同遍历方式。
堕落飞鸟
2023/05/04
1630
[设计模式]之九:迭代器模式
迭代器分离了集合对象的遍历行为,抽象出一个迭代器负责。这既可以不暴露内部结构,也让外部代码透明地访问集合内部数据
wOw
2018/09/18
2600
[设计模式]之九:迭代器模式
【一起学系列】之迭代器&组合:虽然有点用不上啦
【产品】:嘿,有一个好消息,咱们旗下的餐厅把月巴克的咖啡店吞并了!太棒了!年终奖稳了!
Kerwin
2020/07/30
3540
【一起学系列】之迭代器&组合:虽然有点用不上啦
设计模式之组合模式
组合模式:将对象聚合成树形结构来表现“整体/部分”的层次结构。 组合模式能让客户以一致的方式来处理个别对象以及对象组合。 也就是我们可以忽略对象组合与个体对象之间的差别
用户9854323
2022/06/25
2020
设计模式之组合模式
用C# (.NET Core) 实现迭代器设计模式
本文的概念来自深入浅出设计模式一书 项目需求 有两个饭店合并了, 它们各自有自己的菜单. 饭店合并之后要保留这两份菜单. 这两个菜单是这样的: 菜单项MenuItem的代码是这样的: 最初我们是这样设
solenovex
2018/04/28
8090
用C# (.NET Core) 实现迭代器设计模式
Head First设计模式——迭代器模式
前言:迭代器模式平时用的不多,因为不管C#还是Java都已经帮我封装了,但是你是否知道平时经常在用的东西本质是怎么回事呢。
SpringSun
2020/08/11
3600
Head First设计模式——迭代器模式
设计之禅——迭代器模式
迭代器想必大家不会陌生,作为Java中内置的API,平时我们使用的也是非常多的。但你是否曾想过它和迭代器模式有什么关联?并且Java中已经有for循环遍历,为什么还会需要这样一个类?
夜勿语
2020/09/07
2990
设计模式----迭代器模式
迭代器模式: 提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部表现。 示例:餐厅和煎饼屋合并后,需要遍历菜单时,由于餐厅菜单使用的是数组,而煎饼屋使用的是ArrayList,怎么才能统一地用一种方法来遍历呢? 由于Java内置对迭代器的支持,我们利用javautil.Iterator包来实现。 首先看一下iterator接口: <<interface>>iterator hasNext() next() remove() hasNext() next() remove
SuperHeroes
2018/05/30
4870
设计模式之迭代器与组合模式(二)
在上次的文章中,我们通过层层引导,已经知道了迭代器模式的由来。现在我们再好好总结下。
程序员小跃
2019/12/25
4730
常用设计模式——迭代器模式
迭代器模式 概念 提供一种方法顺序访问一个集合中的各个元素,而又不暴露其内部实现。 示例 演示了迭代器模式,遍历餐厅菜单的例子 /** * 菜单项 * @author huangy on 2019
用户5325874
2020/01/16
5800
常用设计模式——迭代器模式
趣解设计模式之《小店儿菜单的故事》
在一座小镇上,有两家特别有名气的小店,一家是远近闻名的早餐店,它家的早餐特别好吃,每天早上都能排起长长的队伍;另一家是个蛋糕店,他家是专门从法国请来的蛋糕师傅,蛋糕的香味真是香飘万里。
爪哇缪斯
2023/09/26
1590
趣解设计模式之《小店儿菜单的故事》
趣解设计模式之《小店儿菜单的故事》
在一座小镇上,有两家特别有名气的小店,一家是远近闻名的早餐店,它家的早餐特别好吃,每天早上都能排起长长的队伍;另一家是个蛋糕店,他家是专门从法国请来的蛋糕师傅,蛋糕的香味真是香飘万里。
爪哇缪斯
2023/09/14
1940
趣解设计模式之《小店儿菜单的故事》
JAVA 设计模式 迭代器模式
本文介绍了 JAVA 设计模式中的迭代器模式,主要包括了迭代器模式的定义、结构、实现,以及应用场景和推荐。
静默虚空
2018/01/05
8890
JAVA 设计模式 迭代器模式
设计模式之迭代器与组合模式(四)
我们要如何在菜单上应用组合模式呢?一开始,我们需要创建一个组件接口来作为菜单和菜单项的共同接口,让我们能够用统一的做法来处理菜单和菜单项。换句话说,我们可以针对菜单或菜单项调用相同的方法。
程序员小跃
2019/12/27
3440
设计模式之迭代器与组合模式(四)
迭代器模式--沙场秋点兵
小帅在军中官至军师,身居高位,必然要尽心尽责,最近又要主动进行士兵普查,遂命各副将按各个兵种准备士兵名册。
zhanyd
2022/05/16
2900
迭代器模式--沙场秋点兵
【万字图文】详解设计模式(下篇)
本篇关于设计模式的文章是设计模式的下篇,上下两篇文章介绍了整个23种设计模式中的22种,由于解释器模式主要应用场景是在解释器开发中,所以,该模式就只列举出了一些含义和使用场景,并没有类图和示例。而其他的22种设计模式,基本遵循的是:待解决的问题——>应用场景——>模式定义——>类图——>具体实现——>优缺点,这几方面来介绍的。那么,话不多说了,还是老样子,如下为本篇文章的整体目录:
爪哇缪斯
2023/05/10
1.2K0
【万字图文】详解设计模式(下篇)
小谈设计模式(21)—迭代器模式
主要对目前市面上常见的23种设计模式进行逐一分析和总结,希望有兴趣的小伙伴们可以看一下,会持续更新的。希望各位可以监督我,我们一起学习进步,加油,各位。
学编程的小程
2023/10/11
1830
小谈设计模式(21)—迭代器模式
一起学设计模式 - 迭代器模式
迭代器模式听起来可能感觉很陌生,但是实际上, 迭代器模式是所有设计模式中最简单也是最常用的设计模式,正是因为太常用了,所以导致很多人忽略了它的存在。
battcn
2018/08/03
3100
一起学设计模式 - 迭代器模式
06-04-设计模式 迭代器模式
编写程序展示一个学校院系结构:需求是这样,要在一个页面中展示出学校的院系组成,一个学校有多个学院,一个学院有多个系。如图
彼岸舞
2022/05/28
1520
06-04-设计模式 迭代器模式
设计模式之迭代器模式
Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation.
beginor
2020/08/10
3170
设计模式之迭代器模式
相关推荐
设计模式-迭代器模式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验