java设计模式-迭代器模式(Iterator)

来源:互联网 发布:软件 设计说明书 编辑:程序博客网 时间:2024/05/22 12:48

 简述 

迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。


 类图 


 程序范例 

// cat 类public class Cat {private int id;public Cat(int id) {this.id = id;}@Overridepublic String toString() {return "cat:" + id;}}// 抽象集合类public interface MyCollection {void add(Object o);int size();MyIterator CreateIterator();}// 通过数组实现 ArrayListpublic class MyArrayList implements MyCollection {Object[] objects = new Object[10];int index = 0;public void add(Object o) {if (index == objects.length) {Object[] newObjects = new Object[objects.length * 2];System.arraycopy(objects, 0, newObjects, 0, objects.length);objects = newObjects;}objects[index] = o;index++;}public int size() {return index;}public MyIterator CreateIterator() {return new ArrayListIterator();}private class ArrayListIterator implements MyIterator {private int currentIndex = 0;@Overridepublic boolean hasNext() {if (currentIndex >= index)return false;elsereturn true;}@Overridepublic Object next() {Object o = objects[currentIndex];currentIndex++;return o;}}}// 链表节点类public class Node {public Node(Object obj, Node next) {super();this.obj = obj;this.next = next;}public Object getObj() {return obj;}public void setObj(Object obj) {this.obj = obj;}public Node getNext() {return next;}public void setNext(Node next) {this.next = next;}private Node next;private Object obj;}// 通过链表实现 ArrayListpublic class MyLinkedList implements MyCollection {Node head = null;Node cursor = null;int size = 0;public void add(Object o) {Node n = new Node(o, null);if (head == null) {head = n;cursor = head;} else {cursor.setNext(n);cursor = n;}size++;}public int size() {return size;}@Overridepublic MyIterator CreateIterator() {return new LinkedListIterator();}private class LinkedListIterator implements MyIterator {private Node iterator = head;@Overridepublic boolean hasNext() {if (iterator == null)return false;elsereturn true;}@Overridepublic Object next() {Node node = iterator;iterator = node.getNext();return node.getObj();}}}// 抽象迭代类public interface MyIterator {Object next();boolean hasNext();}// 测试类public class TestMain {public static void main(String[] args) {MyCollection ma = new MyArrayList();MyCollection ml = new MyLinkedList();for (int i = 0; i < 15; i++) {ma.add(new Cat(i));}for (int i = 15; i < 30; i++) {ml.add(new Cat(i));}System.out.println("MyArrayList:" + ma.size());MyIterator iterator1 = ma.CreateIterator();while (iterator1.hasNext()) {Object o = iterator1.next();System.out.print(o + " ");}System.out.println();System.out.println("MyLinkedList:" + ml.size());MyIterator iterator2 = ml.CreateIterator();while (iterator2.hasNext()) {Object o = iterator2.next();System.out.print(o + " ");}}}


 输出结果 

MyArrayList:15cat:0 cat:1 cat:2 cat:3 cat:4 cat:5 cat:6 cat:7 cat:8 cat:9 cat:10 cat:11 cat:12 cat:13 cat:14 MyLinkedList:15cat:15 cat:16 cat:17 cat:18 cat:19 cat:20 cat:21 cat:22 cat:23 cat:24 cat:25 cat:26 cat:27 cat:28 cat:29 


 优点 

1. 可以遍历访问容器内每一个元素而不必暴露容器的内部情况;隐藏容器的实现细节。

2. 为容器和子容器提供统一的接口,方便调用。


0 0
原创粉丝点击