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. django cookie与session组件

    本文目录 1 会话跟踪技术 2 cookie介绍 Django中操作Cookie Session Django中Session相关方法 Django中的Session配置 CBV中加装饰器 回到目录 ...

  2. ISCC的 Misc——WP

    比赛已经结束了,自己做出来的题也不是很多,跟大家分享一下 Misc 第一题:What is that? 下载链接; 打开 解压 是一个图片 因为分值很少所以题和简单 观察图片是一个向下指的手 说明fl ...

  3. cifX驱动安装及SYCON.net的使用

    编程之路刚刚开始,错误难免,希望大家能够指出. cifX驱动安装及SYCON.net的使用 说明: 简单描述运行cifX的示例之前需要进行的准备,具体的主从站设置请自行查看DVD中的文档. 关于cif ...

  4. JOISC2019 简要题解

    第18回 日本情報オリンピック 春合宿 オンラインコンテスト (JOISC2019) 官网 Day 1 試験 (Examination) description 有\(N\)个学生,每个学生有两科成绩 ...

  5. servlet创建项目过程中,servlet内容重写的两种搭建,tomcat的配置,class的存放位置,web.xml的搭建等注意事项与易错点

    运行一个servlet项目:需要做这些前提工作: 1.配置tomcat,在server选项卡的设置也就基本的设置,HTTP port与JMX port等端口号:基本都是默认的.这里需要注意的是,有的教 ...

  6. 【BZOJ2300】【SCOI2011】糖果

    差点就忘了还有差分约束这个东西……看见了就要学习一个 原题: 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要 ...

  7. Java基础三(Scanner键盘输入、Random随机数、流程控制语句)

    1.引用类型变量的创建及使用2.流程控制语句之选择语句3.流程控制语句之循环语句4.循环高级 ###01创建引用类型变量公式 * A: 创建引用类型变量公式 * a: 我们要学的Scanner类是属于 ...

  8. Centos7提示swap交换空间不足解决方法

    一张图就能解决的问题,就不多bb了

  9. Using C++ new() placement in embedded system

    For new(), there are three definition in C++11, which are listed below. throwing (1) void* operator ...

  10. 来自工厂的 PCB 封装建议

    来自工厂的 PCB 封装建议 以前一直没有注意,现在终于知道了,PCB 的封装方向角度是不可以乱摆的,要根据实际编带情况画. 以实物的编带为参考确定 PCB 封装的画法. 而且编带都有标准. 强烈建议 ...