参考文档:
1.设计模式-可复用面向对象软件的基础
迭代器模式(Iterator)(对象行为型模式)
理论方面的知识,在网上,实在是没有找到好的博客,我把书中的内容贴出来给大家参考一下。
书中案例代码实现:
外部迭代器实现:
AbstractList.java:
package com.rick.designpattern.iterator; /** * Created by MyPC on 2017/6/28. */ public abstract class AbstractList<T> { public abstract Iterator<T> createIterator(); }
List.java:
package com.rick.designpattern.iterator; /** * Created by MyPC on 2017/6/28. */ public class List<T> extends AbstractList { private T[] _ts; private long _size = Integer.MAX_VALUE; public List(long size) { this._size = size; } public List(List<T> list) { _ts = list._ts; _size = list._size; } public List() { } public long count() { return _ts.length; } public T get(int current) { if (_ts.length > current) { return _ts[current]; } return null; } public void add(T[] ts) { _ts = ts; } @Override public Iterator createIterator() { return new ListIterator(this); } }
Iterator.java:
package com.rick.designpattern.iterator; /** * Created by MyPC on 2017/6/28. */ public abstract class Iterator<T> { abstract void first(); abstract void next(); abstract boolean isDone(); abstract T currentItem(); }
ListIterator.java:
package com.rick.designpattern.iterator; /** * Created by MyPC on 2017/6/28. */ public class ListIterator<T> extends Iterator { private List<T> _list; private long _current; ListIterator(List<T> list) { _list = list; _current = 0; } @Override void first() { _current = 0; } @Override void next() { _current++; } @Override boolean isDone() { return _current >= _list.count(); } @Override T currentItem() { if (isDone()) { throw new NullPointerException("iterator is stop "); } return _list.get((int) _current); } }
ReverseListIterator.java:
package com.rick.designpattern.iterator; /** * Created by MyPC on 2017/6/28. */ public class ReverseListIterator<T> extends Iterator { private List<T> _list; private long _current; ReverseListIterator(List<T> list) { _list = list; _current = _list.count() - 1; } @Override void first() { _current = _list.count() - 1; } @Override void next() { _current--; } @Override boolean isDone() { return _current < 0; } @Override Object currentItem() { if (isDone()) { return new NullPointerException("iterator is stop"); } return _list.get((int) _current); } }
Employee.java:
package com.rick.designpattern.iterator; /** * Created by MyPC on 2017/6/28. */ public class Employee { private String name; public Employee(String name) { this.name = name; } @Override public String toString() { return "My name is " + name; } }
Client.java:
package com.rick.designpattern.iterator; /** * Created by MyPC on 2017/6/28. */ public class Client { public static void main(String[] args) { List<Employee> employees = new List<Employee>(); Employee[] employees1 = new Employee[]{ new Employee("a"), new Employee("b"), new Employee("c"), new Employee("d"), new Employee("e") }; employees.add(employees1); //外置迭代器实现 ListIterator listIterator = new ListIterator(employees); ReverseListIterator reverseListIterator = new ReverseListIterator(employees); printEmployees(listIterator); listIterator = null; System.out.println("-----------------"); printEmployees(reverseListIterator); reverseListIterator = null; //外置迭代器,工厂方法实现 Iterator iterator = employees.createIterator(); System.out.println("-----------------"); printEmployees(iterator); iterator = null; System.out.println("-----------------"); //内置迭代器实现 PrintNEmployees printNEmployees = new PrintNEmployees(employees, 2); printNEmployees.traverser(); } public static void printEmployees(Iterator<Employee> iterator) { for (iterator.first(); !iterator.isDone(); iterator.next()) { System.out.println(iterator.currentItem().toString()); } } }
内置迭代器实现:ListTraverser.java:
package com.rick.designpattern.iterator; /** * Created by MyPC on 2017/6/28. */ public abstract class ListTraverser<T> { private ListIterator<T> _listIterator; public ListTraverser(List<T> _list) { this._listIterator = new ListIterator<T>(_list); } public boolean traverser() { boolean result = false; for (_listIterator.first(); !_listIterator.isDone(); _listIterator.next()) { result = processItem(_listIterator.currentItem()); if (result == false) { break; } } return result; } protected abstract boolean processItem(T t); }
PrintNEmployees.java:
package com.rick.designpattern.iterator; /** * Created by MyPC on 2017/6/28. */ public class PrintNEmployees extends ListTraverser<Employee> { private int _total, _count; public PrintNEmployees(List<Employee> _list, int n) { super(_list); _total = n; _count = 0; } @Override protected boolean processItem(Employee employee) { _count++; System.out.println(employee.toString()); return _count < _total; } }