设计模式—迭代器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 ...
随机推荐
- Swoole系列(三):建立TCP服务器并发送数据测试
<?php // 建立tcp服务器下 $host = '0.0.0.0'; $port = 9501; $serv = new swoole_server($host,$port); $serv ...
- Ultra-QuickSort - poj 2299 (归并排序+统计逆序数)
利用归并排序统计逆序数,利用归并求逆序在对子序列s1和s2在归并时(s1,s2已经排好序),若s1[i]>s2[j](逆序状况),则逆序数加上s1.length-i,因为s1中i后面的数字对于s ...
- Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rights
第一次提交遇到这样的情况,怎么回事呢,我在github上提交了ssh key 的啊. 排查先看看能不能解析, 1.先 ping https://github.com 把ip添加到 host : ...
- Android Otto框架浅析
今天要介绍的是一个Android中使用得比較多的android 事件总线 EventBus模式的一个框架Otto. Otto 官网:http://square.github.io/otto/ 一.An ...
- 怎样在Mac OS X上面指定Eclipse启动时用指定的某一版本号JDK?
编辑 $ECLIPSE_HOME/Eclipse.app/Contents/MacOS/eclipse.ini 文件.在 Finder 中右键或者Ctrl+点击 Eclipse 应用程序.然后点击&q ...
- SQL查临时表没有返回数据集
问题描述:在SQL中可以查询到数据,返回不到页面上. 解决办法: set nocount on create table #list [转] 每次我们在使用查询分析器调试SQL语句的时候,通常会看到一 ...
- git github usage
以gerrit-trigger-plugin为例,下面的链接都是从相应页面上直接拷贝的. 法一:不用github的账号,打开这个库在github上的主页,运行下面命令即可 read only 运行命令 ...
- 分界线<hr/>
<hr align="center" noshade="noshade" width="90px" color="#1DAB ...
- Qt for Android 启动短暂的黑屏或白屏问题如何解决?
解决方法一: 使用透明主题 点击项目 -> 在 构建设置 里面找到 Build Android APK 栏目,点击 create templates 创建一个 AndroidManifest.x ...
- MySQL权限系统(二). MySQL提供的特权 Privileges Provided by MySQL
MySQL provides privileges that apply in different contexts and at different levels of operation: Adm ...