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

迭代器模式

概念

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

image-20190608130721598

示例

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

/**
 * 菜单项
 * @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
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值