设计模式—迭代器Iterator模式
什么是迭代器模式?
让用户通过特定的接口访问容器的数据,不需要了解容器内部的数据结构。
首先我们先模仿集合中ArrayList和LinkedList的实现。一个是基于数组的实现、一个是基于链表的实现,实现方式各有不同,
为了减少代码的耦合度,面向接口编程。定义Collection接口定义API规范。

可是在遍历集合中的元素时,由于数组和链表的遍历方式不一样,能不能统一处理呢?
再定义一个Iterator接口,让每一个子类集合都实现接口中的方法。
1.接口Collection.java
public interface Collection<E> {
public void add(E e);
public int size();
public Iterator iterator();
}
2.接口Iterator.java
public interface Iterator {
public Object next();
public boolean hasNext();
}
3.实现ArrayList.java
public class ArrayList<E> implements Collection<E>{
//先给定一个长度为10的数组
Object [] objects = new Object[];
//冗余一个int指数,方便判定是组是否为满和返回集合大小
int index = 0;
@Override
//1.动态添加元素
public void add(E e) {
//1.1先判断数组是否已满
if(index == objects.length){
Object [] newObjects = new Object[objects.length*2];
System.arraycopy(objects, 0, newObjects, 0, objects.length);
objects = newObjects; //数组是引用数据类型
}
//1.2为新添加的元素指定下标
objects[index] = e;
//1.3index自加1,以方便返回集合在大小
index++;
}
//2.根据下标访问元素
@Override
//3.返回集合大小
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;
}
return true;
}
}
}
4.Node.java
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;
}
}
5.实现LinkedList.java
public class LinkedList<e> implements Collection<e> {
private Node head;
private Node tail;
private int size;
public void add(E e){
Node n = new Node(e, null);
if(head == null){
head = n;
tail = n;
size++;
} else {
tail.setNext(n);
tail = n;
size++;
}
}
public int size(){
return size;
}
@Override
public Iterator iterator() {
return new LinkedListIterator();
}
private class LinkedListIterator implements Iterator {
private Node currentNode = head;
@Override
public Object next() {
Object o = currentNode.getData();
currentNode = currentNode.getNext();
return o;
}
@Override
public boolean hasNext() {
if(currentNode.getNext() == null){
return false;
}
return true;
}
}
}
在以上的实现可关注:1.ArrayList和LinkedList的不同实现方式
2.Iterator模式的运用
3.实现Iterator时内部类的使用
设计模式—迭代器Iterator模式的更多相关文章
- 设计模式——迭代器(Iterator)模式
概述 迭代器模式简单的说(按我目前的理解)就是一个类提供一个对外迭代的接口,方面调用者迭代.这个迭代接口至少包括两个方法:hasNext()--用于判断是否还有下一个,next()--用于取出下一个对 ...
- Java 实现迭代器(Iterator)模式
类图 /** * 自己定义集合接口, 相似java.util.Collection * 用于数据存储 * @author stone * */ public interface ICollection ...
- 1、迭代器 Iterator模式 一个一个遍历 行为型设计模式
1.Iterator模式 迭代器(iterator)有时又称游标(cursor)是程序设计的软件设计模式,可在容器(container,例如链表或者阵列)上遍访的接口,设计人员无需关心容器的内容. I ...
- 设计模式C++描述----20.迭代器(Iterator)模式
一. 举例说明 我们知道,在 STL 里提供 Iterator 来遍历 Vector 或者 List 数据结构. Iterator 模式也正是用来解决对一个聚合对象的遍历问题,将对聚合的遍历封装到一个 ...
- 设计模式之Iterator模式
STL里的iterator就是应用了iterator模式. 一.什么是迭代模式 Iterator模式也叫迭代模式,是行为模式之一,它把对容器中包含的内部对象的访问委让给外部类,使用Iterator按顺 ...
- Java设计模式之Iterator模式
分类: [java]2013-07-15 10:58 917人阅读 评论(0) 收藏 举报 所谓Iterator模式,即是Iterator为不同的容器提供一个统一的访问方式.本文以java中的容器为例 ...
- Head First 设计模式 —— 10. 迭代器 (Iterator) 模式
思考题 public void printMenu() { PancakeHouseMenu pancakeHouseMenu = new PancakeHouseMenu(); ArrayList ...
- 设计模式:Iterator模式
目的:将数据的存储和数据的查询分开,降低数据的耦合性 继承关系图: 例子: //定义迭代器接口 template<typename T> class Iterator { public: ...
- 设计模式之Iterator模式(2)
这篇文章比较简单,作一个笔记. 模拟Iterator. Iterator接口: package cn.asto.Interator; public interface Iterator { publi ...
随机推荐
- hdu2049 不容易系列之(4)——考新郎 错排+组合 一共有N对新婚夫妇,N个新娘随机坐成一排,每个新郎只能选一个, 其中有M个新郎找错了新娘,求发生这种情况一共有多少种可能.
不容易系列之(4)——考新郎 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- java 通过Apache poi导出excel代码demo实例
package com.zuidaima.excel.util; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutput ...
- jquery.cookie.js 使用小结
先引入jquery,再引入:jquery.cookie.js 添加一个"会话cookie" $.cookie('the_cookie', 'the_value'); 这里没有指明 ...
- Java类载入器原理分析
一:Java虚拟机中能够安装多个类载入器,系统默认是三个基本的类载入器: Bootstrap ExtClassLoader AppClassLoader 类载入器也是Java类.由于其它Java类 ...
- Unity3D学习笔记——NGUI之Property Binding
Property Binding:用于绑定两个组件,然后可以将一个组件的信息发送给另一个组件. 效果图如下: 一:使用步骤 1.建立一个Sprite 2.建立一个Label 3.为Sprite添加Pr ...
- ios [__NSCFNumber isEqualToString:]: unrecognized selector sent to instance 0x7a97d4c0'报错
今天接口由get换成post,我去改进行登录但出现了这个错误,首先出错先看能不能与服务器交互,能不能获得数据,其次,获得的数据是不是你想要的,记住,首先出错要想到是自己的问题,还有就是程序崩了要学会自 ...
- Unity3d 重力感应
Input.acceleration 加速度 最近一次测量的设备在三维空间中的线性加速度(只读); void Update () { v3=Input.acceleration; } void OnG ...
- Android开发:《Gradle Recipes for Android》阅读笔记1.2
在android开发中会需要配置使用app的android SDK的最低版本和目标版本,这个是bulidl.gradle的android模块设置.默认有以下几个设置: applicationId,这个 ...
- 49、android ListView几个比较特别的属性
由于这两天在做listView的东西,所以整理出来一些我个人认为比较特别的属性,通过设置这样的属性可以做出更加美观的列表 android:stackFromBottom="true" ...
- java.lang.VerifyError: Expecting a stack map frame
https://blog.csdn.net/u013066244/article/details/78434134 对于java7而言,需要添加 -XX:-UseSplitVerifier(已实践). ...