专栏首页用户5325874的专栏常用设计模式——迭代器模式

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

迭代器模式

概念

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

示例

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

/**
 * 菜单项
 * @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 +
                '}';
    }
}
/**
 * 餐厅菜单
 * @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);
    }
}
/**
 * 菜单项迭代器
 * @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));
    }
}
/**
 * 迭代器接口
 * @author huangy on 2019-06-07
 */
public interface Iterator {

    boolean hasNext();

    Object next();
}
/**
 * 女招待员
 * @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());
        }
    }
}
/**
 * @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();
    }

}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 常用设计模式——复合模式

    视图:用来呈现模型。视图通常直接从模型中取得它需要显示的状态和数据。视图使用组合模式实现用户界面,用户界面通常组合了嵌套的组件,像面板、框架和按钮。

    用户5325874
  • 常用设计模式——责任链模式

    责任链模式(Chain of Responsibility Pattern)是一种常见的行为模式。

    用户5325874
  • 常用设计模式——装饰模式

    装饰者模式动态地将责任附加到对象上。若要扩展功能,装饰者模式提供了比继承更有弹性的方案

    用户5325874
  • Head First设计模式——生成器模式和责任链模式

    现又一个度假计划指定,需要指定度假每一天的活动、旅馆、用餐、门票等等事情,但是每个客人的度假计划可能不太一样。例如天数、活动类型、用餐等等。

    SpringSun
  • 【抽象那些事】命令式抽象

    撸码那些事
  • 【抽象那些事】 命令式抽象

    这种坏味是由操作转换为类引起的,表现为类中只定义了一个方法,有时候类名和方法名相同。这种坏味还常常表现为方法操作的数据位于另一个类中。

    撸码那些事
  • 小游戏——金庸奇侠传(JAVA,对面向对象的进一步了解)

    泰斗贤若如
  • 设计模式之行为型模式

    将一个请求封装成一个对象 ,从而使我们可用不同请求对客户进行参数化 :对请求排队或记录请求日志 ,以及支持可撤销的操作 .也叫: 动作Action模式 ,事务t...

    时间静止不是简史
  • 设计模式之工厂方法模式

    工厂方法模式(Factory Method Pattern) 隶属于设计模式中的创建型模式,前面的简单工厂模式是工厂方法模式的简化版,因此两者在很多方面都是相似...

    Dylan Liu
  • Lombok,嗯,真香香香香香香!

    它大致意思是:Lombok是一个很牛批的插件(本质是个Java库),项目里一旦引入了Lombok神器之后,你项目中所有诸如:对象的构造函数、 equals()方...

    macrozheng

扫码关注云+社区

领取腾讯云代金券