什么是迭代器模式?

让用户通过特定的接口访问容器的数据,不需要了解容器内部的数据结构。

首先我们先模仿集合中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模式的更多相关文章

  1. 设计模式——迭代器(Iterator)模式

    概述 迭代器模式简单的说(按我目前的理解)就是一个类提供一个对外迭代的接口,方面调用者迭代.这个迭代接口至少包括两个方法:hasNext()--用于判断是否还有下一个,next()--用于取出下一个对 ...

  2. Java 实现迭代器(Iterator)模式

    类图 /** * 自己定义集合接口, 相似java.util.Collection * 用于数据存储 * @author stone * */ public interface ICollection ...

  3. 1、迭代器 Iterator模式 一个一个遍历 行为型设计模式

    1.Iterator模式 迭代器(iterator)有时又称游标(cursor)是程序设计的软件设计模式,可在容器(container,例如链表或者阵列)上遍访的接口,设计人员无需关心容器的内容. I ...

  4. 设计模式C++描述----20.迭代器(Iterator)模式

    一. 举例说明 我们知道,在 STL 里提供 Iterator 来遍历 Vector 或者 List 数据结构. Iterator 模式也正是用来解决对一个聚合对象的遍历问题,将对聚合的遍历封装到一个 ...

  5. 设计模式之Iterator模式

    STL里的iterator就是应用了iterator模式. 一.什么是迭代模式 Iterator模式也叫迭代模式,是行为模式之一,它把对容器中包含的内部对象的访问委让给外部类,使用Iterator按顺 ...

  6. Java设计模式之Iterator模式

    分类: [java]2013-07-15 10:58 917人阅读 评论(0) 收藏 举报 所谓Iterator模式,即是Iterator为不同的容器提供一个统一的访问方式.本文以java中的容器为例 ...

  7. Head First 设计模式 —— 10. 迭代器 (Iterator) 模式

    思考题 public void printMenu() { PancakeHouseMenu pancakeHouseMenu = new PancakeHouseMenu(); ArrayList ...

  8. 设计模式:Iterator模式

    目的:将数据的存储和数据的查询分开,降低数据的耦合性 继承关系图: 例子: //定义迭代器接口 template<typename T> class Iterator { public: ...

  9. 设计模式之Iterator模式(2)

    这篇文章比较简单,作一个笔记. 模拟Iterator. Iterator接口: package cn.asto.Interator; public interface Iterator { publi ...

随机推荐

  1. IOS设计模式浅析之原型模式(Prototype)

    原型模式的定义 “使用原型实例指定创建对象的种类,并通过复制这个原型创建新的对象”.最初的定义出现于<设计模式>(Addison-Wesley,1994). 简单来理解就是根据这个原型创建 ...

  2. 微信蓝牙ble记录

    参加了一个简单的微信蓝牙ble项目,做一些记录 首先按网站上面的各种配置 简单的说就是,软件上面,生成deviceid->绑定设备和deviceid. 几点注意: 1>deviceid是唯 ...

  3. Yii简单使用阿里云短信教程!

    首先我们下载官方完整包的SDK官方标明了啊,PHP版本一定要不低于5.5下载后目录如下: 我们只需要将目录里的api_sdk复制出来到Yii项目的根目录的common模块下面的extensions文件 ...

  4. 【转】Android自动化测试(UiAutomator)简要介绍

    一.一个BUG引发的问题   如果研发过程中有一个BUG:“不断的切换手机语言出现花屏现象”.这个问题我们如何验证呢?我想,最好的方式应该是自动化测试.    那么,自动化测试可以完成哪些任务呢?  ...

  5. Photoshop脚本之调试

    系统:mac 创建test.scpt和test.jsx command+空格,打开 脚本编辑器(applescript) 脚本编辑器打开test.scpt 输入: tell application & ...

  6. ps -ef | grep java 查看所有关于java的进程

    ps -ef | grep java   查看所有关于java的进程

  7. SlidingMenu官方实例分析8——CustomAnimation

    CustomAnimation 构造方法: 其中CanvasTransformer对象是重点,因为他是实现动画的对象,设置对象的代码如下: 其中变化方法如下: 其中的canvas.scale(),方法 ...

  8. hdu 1956(混合图的欧拉回路)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1956 思路:先将无向边定向,比如1<->3,可以定它的方向为1->3,1的出度++, ...

  9. python提供了一个进行hash加密的模块:hashlib

    python提供了一个进行hash加密的模块:hashlib下面主要记录下其中的md5加密方式 import hashlib data1 = 'sada' #####字母和数字 m = hashlib ...

  10. ApiDoc 和 Swagger 接口文档

    ApiDoc:https://blog.csdn.net/weixin_38682852/article/details/78812244 Swagger git: https://github.co ...