Iterator模式
主要是用在容器的遍历上,其他的地方都不怎么用;理解一下,会用了就可以了;
 

1、背景                    

请动手自己写一个可以动态添加对象的容器;
代码:
ArrayList.java(是自己实现的,不是JDK)
package com.cy.dp.iterator;

public class ArrayList {
Object[] objects = new Object[10];
int index = 0; //objects下一个空的位置 /**
* 如果数组容量已满,这里简单处理,扩容为原来的两倍;
* sun的做法是有一个加权值,根据原来的容量,加上多少...
* @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++;
} public int size(){
return index;
} }

Cat.java  辅助类:

package com.cy.dp.iterator;

public class Cat {
private int id; public Cat(int id) {
super();
this.id = id;
}
}

Test.java 测试类:

package com.cy.dp.iterator;

import com.cy.dp.iterator.ArrayList;

public class Test {
public static void main(String[] args) {
ArrayList al = new ArrayList();
for(int i=0; i<15; i++){
al.add(new Cat(i));
}
System.out.println(al.size()); }
}

2.上面容器的底层实现是用数组,下面使用链表来做个容器;

简单解释链表:
每一个链表里面装的都是一个一个的节点,每个节点里面包括两部分内容:1.数据本身 2.指向下一个节点的一个引用;
 
代码:
Node.java:
package com.cy.dp.iterator;

public class Node {
private Object data;
private Node next; public 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;
}
}
LinkedList.java:
package com.cy.dp.iterator;

public class LinkedList {
Node head = null;
Node tail = null; //最末尾的节点
int size = 0; //记录当前链表里面Node个数 public void add(Object o){
Node n = new Node(o, null);
if(head==null){
head = n;
tail = n;
}
tail.setNext(n);
tail = n;
size++;
} public int size(){
return size;
}
}

Test.java 测试类:

package com.cy.dp.iterator;

import com.cy.dp.iterator.ArrayList;
import com.cy.dp.iterator.LinkedList; public class Test {
public static void main(String[] args) {
//ArrayList al = new ArrayList();
LinkedList al = new LinkedList(); for(int i=0; i<15; i++){
al.add(new Cat(i));
}
System.out.println(al.size());
}
}

3.考虑容器的可替换性        

Test类中的容器类可以替换,但是测试方法无须修改;比如LinkedList里面添加元素方法为addObject()的话,那么代码就要重新修改了;
所以有必要对ArrayList和LinkedList对外公开的方法统一起来;
使用接口Collection,面向接口编程;好处是灵活,可扩展;
 
于是就变成了代码:
Collection.java:
package com.cy.dp.iterator;

public interface Collection {
void add(Object o);
int size();
}

ArrayList.java (实现Collection接口)

package com.cy.dp.iterator;

import com.cy.dp.iterator.Collection;

public class ArrayList implements Collection {
Object[] objects = new Object[10];
int index = 0; //objects下一个空的位置 /**
* 如果数组容量已满,这里简单处理,扩容为原来的两倍;
* sun的做法是有一个加权值,根据原来的容量,加上多少...
* @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++;
} public int size(){
return index;
} }

LinkedList.java(实现Collection接口)

package com.cy.dp.iterator;

import com.cy.dp.iterator.Collection;

public class LinkedList implements Collection {
Node head = null;
Node tail = null; //最末尾的节点
int size = 0; //记录当前链表里面Node个数 public void add(Object o){
Node n = new Node(o, null);
if(head==null){
head = n;
tail = n;
}
tail.setNext(n);
tail = n;
size++;
} public int size(){
return size;
}
}

Test.java测试类:

public class Test {
public static void main(String[] args) {
Collection c = new LinkedList(); for(int i=0; i<15; i++){
c.add(new Cat(i));
}
System.out.println(c.size());
}
}

4.容器的遍历                

因为上面ArrayList的遍历方式和LinkedList的遍历方式不同,遍历方式不统一的话,实现方式一变,代码就得跟着变;
每一种容器都有自己的遍历方式,那么能不能找到一种统一的遍历方式呢?
 
代码:
Iterator接口:
package com.cy.dp.iterator;

public interface Iterator {
Object next();
boolean hasNext();
}

Collection接口:

package com.cy.dp.iterator;

public interface Collection {
void add(Object o);
int size();
Iterator iterator();
}

ArrayList.java:

package com.cy.dp.iterator;

import com.cy.dp.iterator.Collection;

public class ArrayList implements Collection {
Object[] objects = new Object[10];
int index = 0; //objects下一个空的位置 /**
* 如果数组容量已满,这里简单处理,扩容为原来的两倍;
* sun的做法是有一个加权值,根据原来的容量,加上多少...
* @param o
*/
@Override
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++;
} @Override
public int size(){
return index;
} @Override
public Iterator iterator(){
return new ArrayListIterator();
} private class ArrayListIterator implements Iterator{
private int currentIndex = 0; @Override
public Object next() {
Object o = objects[currentIndex];
currentIndex++;
return o;
} @Override
public boolean hasNext() {
if(currentIndex >= index) return false;
else return true;
}
}
}

LinkedList.java:

package com.cy.dp.iterator;

import com.cy.dp.iterator.Collection;

public class LinkedList implements Collection {
Node head = null;
Node tail = null; //最末尾的节点
int size = 0; //记录当前链表里面Node个数 @Override
public void add(Object o){
Node n = new Node(o, null);
if(head==null){
head = n;
tail = n;
}
tail.setNext(n);
tail = n;
size++;
} @Override
public int size(){
return size;
} //返回一个实现了Iterator接口的匿名类
@Override
public Iterator iterator(){
return new Iterator(){
Node currentNode = head; @Override
public Object next() {
Object o = currentNode.getData();
currentNode = currentNode.getNext();
return o;
} @Override
public boolean hasNext() {
if(currentNode==null) return false;
else return true;
}
};
}
}

Test.java 测试类:

public class Test {
public static void main(String[] args) {
Collection c = new LinkedList();
//Collection c = new ArrayList(); for(int i=0; i<15; i++){
c.add(new Cat(i));
}
System.out.println(c.size()); Iterator it = c.iterator();
while(it.hasNext()){
System.out.println(it.next());
} }
}

打印:

15
Cat [id=0]
Cat [id=1]
Cat [id=2]
Cat [id=3]
Cat [id=4]
Cat [id=5]
Cat [id=6]
Cat [id=7]
Cat [id=8]
Cat [id=9]
Cat [id=10]
Cat [id=11]
Cat [id=12]
Cat [id=13]
Cat [id=14]
 
 

java设计模式-Iterator的更多相关文章

  1. Java设计模式之Iterator模式

    分类: [java]2013-07-15 10:58 917人阅读 评论(0) 收藏 举报 所谓Iterator模式,即是Iterator为不同的容器提供一个统一的访问方式.本文以java中的容器为例 ...

  2. Java 设计模式实现 不错的引用

    这段时间有兴趣重新温习一下设计模式在Java中的实现,碰巧看到一个不错的设计模式总结,这里引用一下作为参考. 创建型模式: JAVA设计模式-Singleton JAVA设计模式-Factory JA ...

  3. Java设计模式(12)迭代模式(Iterator模式)

    上了这么多年学,我发现一个问题,好象老师都很喜欢点名,甚至点名都成了某些老师的嗜好,一日不点名,就饭吃不香,觉睡不好似的,我就觉得很奇怪,你的课要是讲的好,同学又怎么会不来听课呢,殊不知:“误人子弟, ...

  4. Java 设计模式系列(十五)迭代器模式(Iterator)

    Java 设计模式系列(十五)迭代器模式(Iterator) 迭代器模式又叫游标(Cursor)模式,是对象的行为模式.迭代子模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部表象(interna ...

  5. 设计模式 - 迭代模式(iterator pattern) Java 迭代器(Iterator) 详细解释

    迭代模式(iterator pattern) Java 迭代器(Iterator) 详细解释 本文地址: http://blog.csdn.net/caroline_wendy 參考迭代器模式(ite ...

  6. 《JAVA设计模式》之迭代器模式(Iterator)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述迭代子(Iterator)模式的: 迭代子模式又叫游标(Cursor)模式,是对象的行为模式.迭代子模式可以顺序地访问一个聚集中的元素而不 ...

  7. Java设计模式之行为型模式

    行为型模式共11种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式.备忘录模式.状态模式.访问者模式.中介者模式.解释器模式. 策略模式:策略模式的决定权在用户,系统本身提供不同 ...

  8. JAVA 设计模式 迭代器模式

    用途 迭代器模式 (Iterator) 提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示. 迭代器模式是一种行为型模式. 结构

  9. java集合-Iterator迭代

    我们常常使用 JDK 提供的迭代接口进行 Java 集合的迭代. Iterator iterator = list.iterator(); while(iterator.hasNext()){ Str ...

随机推荐

  1. 服务器-华为RH2288H V3-Server 2008R2忘记登录密码操作方法

    1.插入PE盘,重启服务器. 下载地址:http://pan.baidu.com/s/1c16cP6C 密码: 18hq 注:这是支持全系列阵列卡的专用服务器PE工具,市面上的绝大多数PE在服务器中都 ...

  2. Django模型层之多表操作

    ----------------https://www.cnblogs.com/liuqingzheng/articles/9499252.html 实例:我们来假定下面这些概念,字段和关系 一 创建 ...

  3. 怎样去掉wordpress中默认的未分类目录

    默认的是不能删除的,要删除未分类,需要将默认的分类目录设置为其他 具体设置方法为:后台-设置-撰写,将撰写设置下面的默认链接分类目录设置为其他的,点击下面的保存更改,然后就可以删除默认的未分类目录了.

  4. Comet OJ - Contest #2 简要题解

    Comet OJ - Contest #2 简要题解 cometoj A 模拟,复杂度是对数级的. code B 易知\(p\in[l,r]\),且最终的利润关于\(p\)的表达式为\(\frac{( ...

  5. LeetCode - Partition Labels

    A string S of lowercase letters is given. We want to partition this string into as many parts as pos ...

  6. 【BZOJ1823】【JSOI2010】满汉全席

    差点忘了2-sat…… 原题: 满汉全席是中国最丰盛的宴客菜肴,有许多种不同的材料透过满族或是汉族的料理方式,呈现在數量繁多的菜色之中.由于菜色众多而繁杂,只有极少數博学多闻技艺高超的厨师能够做出满汉 ...

  7. POJ3904 Sky Code

    题意 Language:Default Sky Code Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3980 Accepte ...

  8. RN中移动组件开发

    在原生的开发中,如果要自定义一些控件,可能会用到touch的相关方法,而React Native也有一套touch机制,说白了就是用JS写了一套方法打通android和ios平台,这里简单讲解下Rea ...

  9. <------------------字符流--------------------->

    FileWriter 字符输出流: 方法: 写入:write 刷新:flush public static void main(String[] args) throws IOException { ...

  10. MySQL Partition--分区基础

    ================================================================================= Mysql在5.1版本时增加对分区表 ...