美文网首页
Android设计模式-迭代器模式

Android设计模式-迭代器模式

作者: 考拉525 | 来源:发表于2020-11-23 15:16 被阅读0次

1、定义

迭代器模式提供一种方法遍历一个集合中的元素,而又不暴露其内部的表示。

2、介绍

  • 让我们能遍历集合内的每一个元素,而又不暴露其内部的表示
  • 把遍历的任务放在迭代器上,而不是聚合上,这样简化了集合的接口和实现,也让责任各得其所,符合单一职责原则

3、UML类图

迭代器模式.png

角色说明

  • Aggregate(集合接口):定义集合的基本功能和创建迭代器的接口,将客户端代码从集合对象的实现解耦
  • ConcreteAggregate(具体集合类):实现基本功能,并实例化一个具体迭代器,此迭代器能够遍历该对象集合
  • Client(客户端)
  • Iterator(迭代器接口):所有具体迭代器都必须实现的接口,包含遍历的一些方法,通常有netx()、hasNext()、remove()方法。
  • ConcreteIterator(具体迭代器类):负责实现迭代器接口来实现集合的遍历。

4、实现

4.1 定义集合接口
interface Aggregate<E>{
    void add(E e);
    //....
    IIterator<E> createIterator();
}
4.2 定义迭代器接口
interface IIterator<E> {
    E next();
    boolean hasNext();
    void remove();
}

4.3 具体集合类

这里以菜单为例,菜单结构如下:

class MenuItem {
    String name;
    String des;
    double price;
}

具体集合菜单类,这里用数组来表示菜单集合。

class MenuAggregate implements Aggregate<MenuItem> {
    static final int MAX_ITEMS = 10;
    MenuItem[] menus = new MenuItem[MAX_ITEMS];
    int position = 0;

    @Override
    public void add(MenuItem menuItem) {
        if(position >= MAX_ITEMS) {
            throw new IllegalStateException("out of border");
        } else {
            menus[position] = menuItem;
            position++;
        }
    }
    @Override
    public IIterator<MenuItem> createIterator() {
        return new MenuIterator(menus);
    }
}

4.4 具体迭代器
class MenuIterator implements IIterator<MenuItem> {
    MenuItem[] menus;
    int position = 0;

    public MenuIterator(MenuItem[] menus) {
        this.menus = menus;
    }

    @Override
    public MenuItem next() {
        MenuItem menu = menus[position];
        position += 1;
        return menu;
    }

    @Override
    public boolean hasNext() {
        if (position < menus.length && menus[position] != null) {
            return true;
        }
        return false;
    }
    @Override
    public void remove() {
        if(position <= 0) {
            throw new IllegalStateException("can't remove item");
        }
        if(menus[position -1] != null) {
            for(int i = position-1;i<menus.length;i++) {
                menus[i] = menus[i+1];
            }
        }
    }
}
4.5 客户端调用
Aggregate<MenuItem> aggregate = new MenuAggregate();
aggregate.add(new MenuItem("宫爆鸡丁","川菜",30));
aggregate.add(new MenuItem("水煮鱼","川菜",90));
aggregate.add(new MenuItem("辣子鸡","川菜",32));

IIterator<MenuItem> iIterator = aggregate.createIterator();
while (iIterator.hasNext()) {
    System.out.println(iIterator.next());
}

输出结果

MenuItem{name='宫爆鸡丁', des='川菜', price=30.0}
MenuItem{name='水煮鱼', des='川菜', price=90.0}
MenuItem{name='辣子鸡', des='川菜', price=32.0}

5、优点

  • 使得集合的遍历与管理相分离,符合单一职则
  • 不暴露集合的内部实现

6、缺点

  • 类变多了

7、应用场景

容器遍历,如ArrayList

相关文章

网友评论

      本文标题:Android设计模式-迭代器模式

      本文链接:https://www.haomeiwen.com/subject/ehariktx.html