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. HTTP/2及HTTP/3特性

    HTTP/2及HTTP/3特性 摘要: 学习 HTTP/2 与 HTTP/3. 前言 HTTP/2 相比于 HTTP/1,可以说是大幅度提高了网页的性能,只需要升级到该协议就可以减少很多之前需要做的性 ...

  2. centos 端口开放及关闭 【转】

    之前有讲过公司新买的服务器使用的是CentOS 5.5,部署好Tomcat之后却发现输入114.80.*.*:8080(即ip:8080)却无法显示Tomcat默认的首页.因为以前部署在Win Ser ...

  3. acm 2084

    ////////////////////////////////////////////////////////////////////////////////#include<iostream ...

  4. 简单了解version control

    1.什么是版本控制: 版本控制是指对软件开发过程中各种程序代码.配置文件及说明文档等文件变更的管理,是软件管理的核心思想之一 2.版本控制简述 版本控制最主要的功能就是追踪文件的变更.它将什么时候.什 ...

  5. 《DSP using MATLAB》Problem5.33

    代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Output In ...

  6. 新一代构建工具gradle学习

    简介:Gradle的出现,是技术发展的必然,站在了Ant.maven等构建工具的肩膀上,使用了一种强大且具有表达性的基于Groovy的领域特定语言(DSL),使其拥有易用且灵活的方式去实现定制逻辑.方 ...

  7. c# 复制文件夹

    调用VB.NET方法最便捷 引入 Microsoft.VisualBasic.dll 调用 Microsoft.VisualBasic.FileIO.FileSystem.CopyDirectory( ...

  8. List接口的使用方法

    ★List接口特点: 1.元素存储有序的集合 2.带索引的集合 3.集合中可以有重复的元素 4.常用的子类有ArrayList ,  LinkedList ★List接口的方法:add   , rem ...

  9. goreplay 输出流量捕获数据到 elasticsearch

    goreplay 是一个很不错的流量拷贝,复制工具,小巧,支持一些扩展,当然也提供了企业版,企业版 功能更强大,支持二进制协议的分析 . 为了方便数据的存储,我们可以使用es 进行存储 环境准备 do ...

  10. 03关于C的数组指针

    一.数组与指针有什么关系 (1)地址 数组名就是一个地址,指向一个数组的开端. 从实验结果我们可以看出前三个地址都是一样的,都是数组的开始地址,而最后一个是数组的第二个元素,因为是整型数据,地址加4. ...