Iterator设计模式

面向对象编程思想中,多态是一个最重要的特性,代码灵活性的体现主要是靠这种思想来实现的。现在模拟Sun公司当中的两个集合类LinkedList和ArrayList。这些具体的容器,都可以用一个Collection的接口来接收。最常用的就是遍历容器,而现在不同的容器,遍历它们的具体实现是不同的,而我们可以将遍历的方法封装到一个接口Iterator当中,在这个接口当中实现hasNext()和next()的方法,再由具体的容器去实现它。而作为用户,只需要知道这个容器当中的两个方法就行了,具体的遍历实现,由不同的容器自身给出。


 1 package programe.iterator.model;
2
3 public interface Collection {
4 public void add(Object o);
5 public int size();
6 public Iterator iterator();
7 }
8
9
10 public interface Iterator {
11 public Object next();
12 public boolean hasNext();
13 }

1、ArrayList容器的实现


 1 package programe.iterator.model;
2
3 public class ArrayList implements Collection{
4 Object[] objects=new Object[10];
5 int index=0;
6 @Override
7 public void add(Object o) {
8 if(index==objects.length) {
9 Object[]newObjects=new Object[objects.length*2];
10 System.arraycopy(objects,0,newObjects,0,objects.length);
11 objects=newObjects;
12 }
13 objects[index]=o;
14 index++;
15 }
16
17 @Override
18 public Iterator iterator() {
19 return new ArrayListIterator();
20 }
21
22 @Override
23 public int size() {
24 return index;
25 }
26
27 private class ArrayListIterator implements Iterator {
28 private int currentIndex=0;
29 @Override
30 public boolean hasNext() {
31 if(currentIndex>=index) {
32 return false;
33 }
34 return true;
35 }
36
37 @Override
38 public Object next() {
39 Object o=objects[currentIndex];
40 currentIndex++;
41 return o;
42 }
43
44 }
45 }

2、LinkedList容器实现


 1 package programe.iterator.model;
2
3 public class Node {
4
5 private Object data;
6 private Node next;
7 public Node(Object data,Node next) {
8 this.data=data;
9 this.next=next;
10 }
11 public Object getData() {
12 return data;
13 }
14 public void setData(Object data) {
15 this.data = data;
16 }
17 public Node getNext() {
18 return next;
19 }
20 public void setNext(Node next) {
21 this.next = next;
22 }
23
24 }
25
26
27 public class LinkedList implements Collection{
28
29 Node head=null;
30 Node tail=null;
31 int size=0;
32 @Override
33 public void add(Object o) {
34 Node n=new Node(o,null);
35 if(head==null) {
36 head=n;
37 tail=n;
38 size=1;
39 return;
40 }
41 tail.setNext(n);
42 tail=n;
43 size++;
44 }
45
46 @Override
47 public Iterator iterator() {
48 return new LinkedListIterator();
49 }
50
51 @Override
52 public int size() {
53 return size;
54 }
55
56 private class LinkedListIterator implements Iterator {
57 Node currentNode=head;
58 @Override
59 public boolean hasNext() {
60 if(currentNode.getNext()==null) {
61 return false;
62 }
63 return true;
64 }
65
66 @Override
67 public Object next() {
68 if(currentNode==head) {
69 currentNode=currentNode.getNext();
70 return head;
71 }
72
73 Node next=currentNode.getNext();
74 currentNode=next;
75 return next;
76 }
77 }
78 }

测试代码:


 1 public class Main {
2 public static void main(String[]args) {
3 //Collection c=new ArrayList();
4 Collection c=new LinkedList();
5 for(int i=0;i<15;i++) {
6 c.add(i);
7 }
8 System.out.println(c.size());
9
10 Iterator iter=c.iterator();
11 while(iter.hasNext()) {
12 System.out.println(((Node)iter.next()).getData());
13 }
14 }
15 }

评论:LinkedList容器是基于链表的;ArrayList容器是基于数组的。它们的构造不同,因此遍历方式也不同,如果不提供Iterator这样一个公共方法的接口给用户。那么用户需要记住每一种容器的遍历方法,而现在用户只需记住Iterator接口当中提供的方法即可。这里面的方法适合遍历实现了Iterator接口的容器。遍历只是一个容器具有的方法,不能说将所有的容器都去实现这个方法的接口,因此这里还提供了一个Collection接口,所有容器的接口,而Iterator这个接口仅仅只是Collection接口当中提供的一个方法。因为,各种具体容器除了遍历之外,肯定还有其他的公共需求,这时,一个Collection就可以将具体容器的实现暴露给用户,极大的方便了编程。

Iterator设计模式,布布扣,bubuko.com

时间: 2024-11-05 11:42:18

Iterator设计模式的相关文章

Iterator 设计模式

package Iterator; import java.util.*; /**实现创建具体迭代器角色的接口, 这个具体迭代器角色与该容器的结构相关**/ public class ConcreteContainer implements Container { private Vector vector = null; public Vector getVector() { return vector; } public void setVector(Vector vector) { thi

Iterator设计模式--jdk1.7

参照:http://www.cnblogs.com/tstd/p/5049338.html java.util.Iterator<E>是一个接口,它的定义如下: public interface Iterator<E> { boolean hasNext();//是否还有元素 E next();//下一个元素 void remove();//将迭代器返回的元素删除 } 便利的方法: Collection<String> collection = new ArrayLis

java.util之Iterable与Iterator

package java.lang; import java.util.Iterator; public interface Iterable<T> { Iterator<T> iterator();} Iterable位于java.lang包中,它持有一个Iterator引用 package java.util; public interface Iterator<E> { boolean hasNext(); E next(); void remove();} It

企业架构分析&设计模式 课程

高焕堂的招牌课程 企业架构分析.设计模式和App Framework/SDK开发方法 by 高焕堂 亚太地区Android技术大会 主席 洞庭国际智能硬件检测基地 & 中云企业大数据中心(IDC) 首席架构师 微博:@高焕堂_台北                                课程简介: 本课程依据企业软件开发流程里的先后环节来作教学.主要目标在于介绍和阐述各环节的思想.模式.技术和实践要点.让学员能熟悉当今云计算&大数据潮流下,终端与云端的(业务)架构分析.API设计.框

Java设计模式(二) 之 迭代器模式

源码均以JDK1.8作为参考 1.定义: Iterator提供一种方法访问一个容器对象中各个元素,而又不需要暴露对象的内部细节. 2.解析: 通用类图: 类图解析: 2.1.Iterator抽象迭代器 抽象迭代器负责定义通用的接口约定,基本都是基于JDK中Iterator接口的定义,源码如下: public interface Iterator<E> { boolean hasNext(); E next(); default void remove() { throw new Unsuppo

Java设计模式(三) 之 适配器模式

源码均以JDK1.8作为参考 1.定义: 将一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够在一起工作. 2.解析: Adapter Pattern又称为Wrapper Pattern,提到Adapter Pattern,最先会想到的可能就是电源适配器,例如一台12V的电脑需要改到家用220V交流电源上使用,就需要使用交流电适配器,对电源进行转换. 在Java语言中,就是为了将现有类进行包装或适配来完成既有功能. 通用类图: 类图解析: 2.1.Cl

Java设计模式(四) 之 模板方法模式

源码均以JDK1.8作为参考 1.定义: 定义一个操作中的算法的框架,而将一些步骤延迟到子类中.使得子类可以不改变一个算法的机构即可重定义该算法的某些特定步骤. 2.解析: 通用类图: 类图解析: 模板方法模式非常简单,仅仅使用了Java的继承机制,但它是一个应用非常广泛的模式. 2.1.抽象模板(AbstractClass) 主要定义了模板中一些基本操作(方法),它的方法分为两类: 基本方法: 基本方法也叫基本操作,是由子类实现的方法,并且被模板方法被调用. 模板方法: 可以由一个或几个,一般

Java设计模式(五) 之 工厂模式

源码均以JDK1.8作为参考 1.定义: 定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到子类. 2.解析: 可能乍一看Factory设计模式的定义有点晕,但是细想想Factory的字面含义,其实也是很好理解的,所谓工厂,就是按照指定的需求生产出一些产品,Factory设计模式也不例外,是按照提供给Factory的需求说明,然后Factory按照需求生产出指定的产品,供调用的应用场景使用. 通用类图: 类图解析: 2.1.Product(抽象产品类) 定义产品

HashSet源码解析&amp;Map迭代器

今天的主角是HashSet,Set是什么东东,当然也是一种java容器了. 那么今天的HashSet它又是怎么一回事的,他的存在又是为了解决什么问题呢? 先来看下Set的特点:Set元素无顺序,且元素不可以重复. .想到了什么?无顺序,由于散列的缘故:不可重复,HashMap的key就是不能重复的.是的,你有想对了.HashSet就是基于HashMap的key来实现的,整个HashSet中基本所有方法都是调用的HashMap的方法.利用HashMap可以实现两个卖点:1.不可重复,2.快速查找(