远方有多远,请你告诉我!

迭代器模式

Posted on By 赵赵赵小白

迭代器模式

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

示例

我们有下边两个对象, 分别用 数组、ArrayList 去存放数据, 当我们想要去遍历两个对象的时候需要加入一个遍历方法, 为了保持通用性,需要用一种方法可以让这两个对象用共同的方法去遍历, 这时就可以加入迭代器。

本例只演示了 Menu 加入迭代器, Menu1 同理, 演示都是最基本的原理,可以自行改造,请勿照搬照抄。

  • Menu
public class Menu {
    private String[] args;
    private final int length = 16;
    private int foodNum = 0;

    public Menu() {
        args = new String[length];
    }

    public Menu(int len) {
        args = new String[len];
    }

    public void add(String dishes) {
        args[foodNum++] = dishes;
    }
    
    public String get(int i) {
        return i > length ? null : args[i];
    }

    public int length() {
        return foodNum;
    }
}
  • Menu1
public class Menu1 {
    private ArrayList<String> menu;

    public Menu1() {
        menu = new ArrayList<>();
    }

    public void add(String str) {
        menu.add(str);
    }
}

加入迭代器后

通过实现 Iterator 接口中的 hashNextnext 方法,来实现这个遍历器 当然如果没有并发问题的话也可以加入 remove 方法.

  • MenuIterator
public class MenuIterator implements Iterator<String> {
    private Menu menu;
    private int position = 0;

    public MenuIterator(Menu menu) {
        this.menu = menu;
    }

    @Override
    public boolean hasNext() {
        return null != menu.get(position);
    }

    @Override
    public String next() {
        return menu.get(position++);
    }
}

测试

下边展示的就是迭代器, 相比直接改动 Menu 方法, 添加迭代器更有效也更简洁吧, 把专业的事情交给专业的工具去实现, 不至于导致最初对象的内部混乱。 如果有多个对象需要迭代,我们可以单独写一个方法, 通过传递参数 Iterator 来用多态的方式使用同一个遍历方法。

public static void main(String[] args) {
    final Menu menu = new Menu();
    menu.add("a");
    menu.add("c");
    menu.add("d");
    menu.add("e");
    menu.add("f");

    // 这里也可以用 while 进行遍历,他的领域范围相比 for 更大, 下边循环领域范围只在他的循环体内有用, 这样可以减少不必要的麻烦,这是也是 Efffective Java 中比较推荐的
    // 
    for (final MenuIterator menuIterator = new MenuIterator(menu); menuIterator.hasNext();) {
        System.out.println(menuIterator.next());
    }
}

设计原则

单一职责: 一个类应该只有一个引起变化的原因

组合模式

组合模式: 允许你将对象组合成树形结构来表现 “整体/部分” 层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。

组合模式就是将多个对象引入到同一个对象当中。

参考

  • [Head First Java] P315