设计模式之2 iterator.docx_第1页
设计模式之2 iterator.docx_第2页
设计模式之2 iterator.docx_第3页
设计模式之2 iterator.docx_第4页
设计模式之2 iterator.docx_第5页
已阅读5页,还剩1页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

设计模式之2 iterator模拟实现arraylist。package com.bjsxt.dp.iterator;import com.bjsxt.dp.iterator.*;public class ArrayList implements Collection /初始化就是10个对象Object objects = new Object10;int index = 0;public void add(Object o) /如果到达数组上限,就翻倍,并且把原数组里面的所有内容复制到新数组当中if(index = objects.length) Object newObjects = new Objectobjects.length * 2;System.arraycopy(objects, 0, newObjects, 0, objects.length);/最关键的一步在这里,把老数组的引用指向新数组,那么从arraylist的使用者的角度来说,是看不到内部数组翻倍了。objects = newObjects;objectsindex = o;index +;public int size() /返回的是数组当前的index,而不是数组的真实大小return index;/向外提供的iteratorpublic Iterator iterator() return new ArrayListIterator();/通过一个内部类来实现iterator接口。private class ArrayListIterator implements Iterator private int currentIndex = 0;/目前index的值大于数组的size,就没有下一个了。public boolean hasNext() if(currentIndex = index) return false;else return true;/返回当前数组对应的index处的对象,并把游标指向下一个位置public Object next() Object o = objectscurrentIndex;currentIndex +;return o;通过一个通用的接口,collection。package com.bjsxt.dp.iterator;/通过接口,约束方法的名字public interface Collection void add(Object o);int size();/指定了容器类必须提供iterator方法,这个方法的返回值是IteratorIterator iterator();通过另外一个接口,iteratorpackage com.bjsxt.dp.iterator;public interface Iterator /两个方法,第一是返回一个object对象,第二是看还有没有下一个节点。Object next();boolean hasNext();对于linklist,里面放的元素是node:package com.bjsxt.dp.iterator;public class Node /node的构造方法,传递两个参数,第一是数据本身,第二就是指向下一个节点的nextpublic Node(Object data, Node next) super();this.data = data;this.next = next;public Object getData() return data;public void setData(Object data) this.data = data;public Node getNext() return next;public void setNext(Node next) this.next = next;private Object data;private Node next;linkedlistpackage com.bjsxt.dp.iterator;import com.bjsxt.dp.iterator.Collection;public class LinkedList implements Collection /第一个节点Node head = null;/最后一个节点Node tail = null;/大小int size = 0;/添加项目的方法public void add(Object o) /添加的第一个节点Node n = new Node(o, null);/只有一个节点的情况,它既是头又是尾if(head = null) head = n;tail = n;/每次在最后添加节点,把上一个节点的next指向新添加的节点,并把新节点的next指向null/当前tail(也就是现在list当中的最后一个元素)的next指向新节点tail.setNext(n);/新节点成为新的tail,并且新tail的next自动指向null。tail = n;/同时增大list的size,并且size只在这里变化。size +;public int size() /返回的就是当前list的sizereturn size;/Overridepublic Iterator iterator() return null;假设容器当中放的是catpackage com.bjsxt.dp.iterator;public class Cat public Cat(int id) super();this.id = id;private int id;Overridepublic String toString() return cat: + id;主类,测试用类。package com.bjsxt.dp.iterator;import com.bjsxt.dp.iterator.ArrayList;import com.bjsxt.dp.iterator.LinkedList;public class Test public static void main(String args) /ArrayList al = new ArrayList();/LinkedList al = new LinkedList();/需要灵活的替换容器的类型。/体会多态的引用,和灵活的设计模式,一般都是用父类的引用。然后new不同的子类对象。/多态,利用父类引用指向子类对象。这里叫做面向接口的编程。Collection c = new ArrayList();for(int i=0; i15; i+) c.add(new Cat(i);System.out.println(c.size();/容器的遍历:找到一个统一的遍历方式,事实上,iterator也只是一个接口。/接口当中的遍历方法在每个具体的容器类当中实现。/需要c提供一个iterator,每个具体的容器类提供不同的iterator。比如arraylist就是ArrayListIterator。/使用来自当前容器的iterator。Iterator it = c.iterator();/当我能找到下一个,就把它返回。while(it.hasNext() /next方法返回的是一个object对象。注意这里没有next+方法,也就说,数组游标没有指向下一个。/是因为具体的游标实现在每个容器内部,而不是在iterator当中。Object o = it.next();System.out.print(o + );思想核心: 1. 通过一个通用的接口,collection来限制所有容器都必须实现的方法,方法名必须一致。从而在使用的时候,可以是显示通过父类的对象来指向子类的引用。也就是的多态来访问容器。2. 每个具体的容器在实现collection当中的方法,自己添加了具体的实现。每个容器实现的方法不一样,但是对容器的使用者test.java来说,看不到内部实现的细节,使用起来都是一样。体现了面向对象的封装,隐藏思想。3. 为了提供一个统一的遍历,在collection当时提供了iterator方法。那么所有的容器都要去提供iterator.而iterator本身是一个接口,这个接口的作用就是用来遍历容器当中的对象。在容器内部,采取了内部类的方式来实现这个接口。对于容器当中每个元素的遍历,每个容器实现的方法都不一样,但是对容器的使用者test.java来说,看不到内部实现的细节,使用起来都是一样

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论