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. rest-framework之版本控制

    rest-framework之版本控制 本文目录 一 作用 二 内置的版本控制类 三 局部使用 四 全局使用 五 示例 源码分析 回到目录 一 作用 用于版本的控制 回到目录 二 内置的版本控制类 f ...

  2. Quick Noodle Physics in Blender Tutorial

    https://www.youtube.com/watch?v=Lg7jxAMs60QQuick Noodle Physics in Blender Tutorial 新增平面Plane作为地面; 新 ...

  3. python django day 4 database

    django-admin.py startproject learn_models # 新建一个项目 cd learn_models # 进入到该项目的文件夹 django-admin.py star ...

  4. ElasticSearch安装部署,基本配置(Ubuntu14.04)

    ElasticSearch部署文档(Ubuntu 14.04) 安装java sudo add-apt-repository ppa:webupd8team/java sudo apt-get upd ...

  5. doubleclick protobuf file load to project

    1,download protobuf file to local wget https://developers.google.com/ad-exchange/rtb/downloads/openr ...

  6. IntelliJ快捷键笔记

    1.查找文件:Ctrl+Shift+N 2.大小写转换:Ctrl+Shift+U 3.get/set方法快捷键:Alt+Insert 4. 查看类继承关系:Ctrl+H或者Ctrl+Shift+Alt ...

  7. 什么是数学 (R·柯朗 H·罗宾 著)

    第1章 自然数 引言 $1 整数的计算 1. 算术的规律 2. 整数的表示 3. 非十进位制中的计算 $2 数学的无限性 数学归纳法 1. 数学归纳法原理 2. 等差级数 3. 等比级数 4. 前n项 ...

  8. 【HI3520DV200】sample

    1.vdec不支持1280x720,支持640x480及以下

  9. 腾讯云 COS 对象存储使用

    目前使用腾讯云的对象存储cos服务,将本地的文件同步到cos中,看了腾讯云的用户文档,发现使用COS Migration 工具还是挺适合的. 原因 因为服务器已经安装有java环境,而cos的几个用户 ...

  10. docker 的前台模式和后台模式

    Detached(后台模式) vs foreground(前台模式) 当我们启动一个容器时,首先需要确定这个容器是运行在前台还是运行在后台. -d, --detach Run container in ...