迭代器模式
迭代器模式: 提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
示例
我们有下边两个对象, 分别用 数组、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
接口中的 hashNext
和 next
方法,来实现这个遍历器
当然如果没有并发问题的话也可以加入 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