前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >常用设计模式——迭代器模式

常用设计模式——迭代器模式

作者头像
用户5325874
发布2020-01-16 18:01:02
5410
发布2020-01-16 18:01:02
举报

迭代器模式

概念

提供一种方法顺序访问一个集合中的各个元素,而又不暴露其内部实现。

image-20190608130721598
image-20190608130721598

示例

演示了迭代器模式,遍历餐厅菜单的例子

代码语言:javascript
复制
/**
 * 菜单项
 * @author huangy on 2019-06-07
 */
public class MenuItem {

    private String name;

    private String description;

    private boolean vegetarian;

    private double price;

    public MenuItem(String name, String description, boolean vegetarian, double price) {
        this.name = name;
        this.description = description;
        this.vegetarian = vegetarian;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public boolean isVegetarian() {
        return vegetarian;
    }

    public void setVegetarian(boolean vegetarian) {
        this.vegetarian = vegetarian;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "MenuItem{" +
                "name='" + name + '\'' +
                ", description='" + description + '\'' +
                ", vegetarian=" + vegetarian +
                ", price=" + price +
                '}';
    }
}
代码语言:javascript
复制
/**
 * 餐厅菜单
 * @author huangy on 2019-06-07
 */
public class DinerMenu {

    private MenuItem[] menuItems;

    {
        menuItems = new MenuItem[3];
        menuItems[0] = new MenuItem("name1", "desc1", true, 1);
        menuItems[1] = new MenuItem("name2", "desc2", false, 2);
        menuItems[2] = new MenuItem("name3", "desc3", true, 3);
    }

    /**
     * 返回迭代器接口
     * (1)客户不需要知道餐厅菜单是如何维护菜单项的,也不需要知道迭代器是如何实现的。
     * 客户只需要使用这个迭代器遍历元素就可以了。
     */
    public Iterator createIterator() {
        return new DinerMenuIterator(menuItems);
    }
}
代码语言:javascript
复制
/**
 * 菜单项迭代器
 * @author huangy on 2019-06-07
 */
public class DinerMenuIterator implements Iterator {

    MenuItem[] items;

    int position;

    public DinerMenuIterator(MenuItem[] items) {
        this.items = items;
    }

    @Override
    public Object next() {
        MenuItem menuItem = items[position];
        position = position + 1;
        return menuItem;
    }

    @Override
    public boolean hasNext() {
        return ((position < items.length) && (items[position] != null));
    }
}
代码语言:javascript
复制
/**
 * 迭代器接口
 * @author huangy on 2019-06-07
 */
public interface Iterator {

    boolean hasNext();

    Object next();
}
代码语言:javascript
复制
/**
 * 女招待员
 * @author huangy on 2019-06-08
 */
public class Waitress {

    DinerMenu dinerMenu;

    public Waitress(DinerMenu dinerMenu) {
        this.dinerMenu = dinerMenu;
    }

    public void printMenu() {
        Iterator iterator = dinerMenu.createIterator();

        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}
代码语言:javascript
复制
/**
 * @author huangy on 2019-06-08
 */
public class DemoTest {

    public static void main(String[] args) {
        DinerMenu dinerMenu = new DinerMenu();
        Waitress waitress = new Waitress(dinerMenu);

        waitress.printMenu();
    }

}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 迭代器模式
  • 概念
  • 示例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档