设计模式之Iterator(二)
来源:互联网 发布:ubuntu软件中心在哪里 编辑:程序博客网 时间:2024/05/16 05:25
在上一节的基础上,考虑遍历容器
package com.awiatech.iterator;import com.awiatech.iterator.ArrayList;import com.awiatech.iterator.LinkedList;/** * 测试类用于测试容器的功能。 * @author Chicago * */public class Test {public static void main(String[] args) {//ArrayList al = new ArrayList();//LinkedList al = new LinkedList();// 面向接口编程,好处:灵活、可扩展Collection c = new ArrayList(); // 父类引用指向子类对象for(int i = 0; i < 15; i ++){c.add(new Object());}System.out.println(c.size());// 考虑遍历容器ArrayList al = (ArrayList)c;for(int i = 0; i < al.index; i ++){}}}然而,每种容器都有自己的遍历方式,应想方设法进行统一。每种容器具体遍历的实现不太一样,那么统一时只能用一种共同的接口或抽象类的方式实现。
实现一的优化
定义接口
package com.awiatech.iterator;public interface Iterator {public Object next();public boolean hasNext();}
在Collection接口中添加抽象方法
package com.awiatech.iterator;public interface Collection {public void add(Object o);public int size();public Iterator iterator();}
在ArrayList容器中实现iterator方法,返回Iterator接口的对象
package com.awiatech.iterator;/** * 一个动态添加对象的容器,底层使用数组模拟。 * 与数组相比的好处:不用考虑数组的边界问题,可以动态扩展。 * @author Chicago * */public class ArrayList implements Collection{Object[] objects = new Object[10]; // 定义一个长度为10的数组int index = 0; // 数组索引指向/** * 数组中添加元素 * @param o 要添加的元素 */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 ++; // 移动索引指向}/** * 数组中元素的个数 * @return 返回数组中元素的个数 */public int size(){return index;}/** * 实现了Iterator接口的对象,对于类名并不重要,完全可以定义一个匿名类。 */public Iterator iterator(){return new ArrayListIterator();}/** * 简单的定义一个内部类。 */public class ArrayListIterator implements Iterator{private int currentIndex = 0;@Overridepublic Object next() { // 得到下一个Object o = objects[currentIndex];currentIndex ++;return o;}@Overridepublic boolean hasNext() { // 是否有下一个if(objects[currentIndex] == null) return false;else return true;}}}
测试类中调用Iterator接口的方法
package com.awiatech.iterator;import com.awiatech.iterator.ArrayList;import com.awiatech.iterator.LinkedList;/** * 测试类用于测试容器的功能。 * @author Chicago * */public class Test {public static void main(String[] args) {//ArrayList al = new ArrayList();//LinkedList al = new LinkedList();// 面向接口编程,好处:灵活、可扩展Collection c = new ArrayList(); // 父类引用指向子类对象for(int i = 0; i < 15; i ++){c.add(new Cat(i));}System.out.println(c.size());// 考虑遍历容器//ArrayList al = (ArrayList)c;//for(int i = 0; i < al.index; i ++){////}Iterator it = c.iterator();while(it.hasNext()){Object o = it.next();System.out.print(o + " ");}}}借助于另一个Cat类测试,定义如下
package com.awiatech.iterator;public class Cat {public Cat(int id) {super();this.id = id;}private int id;public int getId() {return id;}public void setId(int id) {this.id = id;}public String toString(){return "cat" + id;}}
实现二的优化
接口Iterator、Collection的定义保持不变
在LinkedList容器中实现iterator方法,返回Iterator接口的对象
package com.awiatech.iterator;/** * 一个动态添加对象的容器,底层使用链表模拟。 * @author Chicago * */public class LinkedList implements Collection{Node head = null; // 链表头Node tail = null; // 链表尾int size = 0; // 链表中元素个数/** * 链表中添加元素 * @param o 要添加的元素 */public void add(Object o){Node n = new Node(o, null); // 构造要添加的节点// 若链表为空,则将链表头和尾都指向新节点if(head == null){head = n;tail = n;}tail.setNext(n); // 原链表尾指向新节点tail = n; // 链表尾重定向到新节点size ++; // 链表中元素数量累加}/** * 链表中元素的个数 * @return 返回链表中元素的个数 */public int size(){return size;}@Overridepublic Iterator iterator() {return new LinkedListIterator();}/** * 简单定义一个内部类。 * @author Chicago * */private class LinkedListIterator implements Iterator{Node index = head;@Overridepublic Object next() { // 得到下一个Object o = index.getData();index = index.getNext();return o;}@Overridepublic boolean hasNext() { // 是否有下一个if(index.getNext() == null && tail.getNext() == null)return false;elsereturn true;}}}
测试类中调用Iterator接口的方法
package com.awiatech.iterator;import com.awiatech.iterator.ArrayList;import com.awiatech.iterator.LinkedList;/** * 测试类用于测试容器的功能。 * @author Chicago * */public class Test {public static void main(String[] args) {//ArrayList al = new ArrayList();//LinkedList al = new LinkedList();// 面向接口编程,好处:灵活、可扩展//Collection c = new ArrayList(); // 父类引用指向子类对象Collection c = new LinkedList();for(int i = 0; i < 15; i ++){c.add(new Cat(i));}System.out.println(c.size());// 考虑遍历容器//ArrayList al = (ArrayList)c;//for(int i = 0; i < al.index; i ++){////}Iterator it = c.iterator();while(it.hasNext()){Object o = it.next();System.out.print(o + " ");}}}
0 0
- 设计模式之Iterator(二)
- 设计模式之二:iterator
- 设计模式(c++)笔记之二十二(Iterator模式)
- 设计模式之二十二------ Iterator(迭代器)
- 设计模式二(迭代子模式 Iterator)
- 设计模式之--迭代器模式(Iterator)
- 设计模式之(Iterator)迭代器模式
- 设计模式之迭代子模式(Iterator)
- 设计模式之Iterator
- 设计模式之Iterator
- 设计模式之 iterator
- 设计模式之Iterator
- 设计模式之Iterator
- 设计模式之Iterator
- 设计模式之iterator
- 设计模式之Iterator
- 23种设计模式之二十二(行为模式)Iterator模式
- 设计模式之Iterator模式
- 上涨后的工资并且排序
- TDDL、Amoeba、Cobar、MyCAT架构比较
- 使用 IO 流,分割/合并 处理大文件
- Masonry的简单使用
- 分享devstack配置文件localrc -- linuxbridge和openvswitchi两种agent
- 设计模式之Iterator(二)
- js原型继承机制实例详解
- 实验3:Unix/Linux权限和文件管理命令
- 用AS跑OPENIM DEMO的问题
- RxJava----操作符:算术和聚合操作符
- android的四大存储之一 SharedPreferences
- ActiveMQ异常排查: peer did not send his wire format.
- 设计模式笔记——工厂模式
- 持续集成工具的发展历程以及未来