设计模式之Iterator模式(2)
这篇文章比较简单,作一个笔记。
模拟Iterator.
Iterator接口:
package cn.asto.Interator;
public interface Iterator {
public boolean hasNext();
public Object next();
}
ArrayList类:
package cn.asto.Interator;
public class ArrayList implements List{
private int index = 0;
private Object[] object = new Object[10];
public void add(Object o ){
if(index==object.length){
Object[] newObject = new Object[object.length+10];
System.arraycopy(object, 0, newObject, 0, object.length);
newObject[index] = o;
object = newObject;
}
object[index]=o;
index++;
}
public int size(){
return index;
}
@Override
public Iterator iterator() {
return new arrayIterator();
}
private class arrayIterator implements Iterator{
private int currentIndex;
@Override
public boolean hasNext() {
if(currentIndex==index)return false;
return true;
}
@Override
public Object next() {
Object o = object[currentIndex];
currentIndex++;
return o;
}
}
}
Test:
package cn.asto.Interator;
public class Test {
public static void main(String args[]){
List a = new ArrayList();
int i = 11;
while(i-->0){
a.add(new Object());
}
Iterator ite = a.iterator();
while(ite.hasNext()){
Object o = ite.next();
System.out.println(o);
}
}
}
每一种集合提供一个实现Iterator的内部类,每次调用iterator返回一个内部的实现,用户不必关心具体的实现。用户只要知道hasNext()判断集合中是否还存在元素,next取得下一个元素。
再次重提 用户不用去关心具体的实现。
LinkedList:
package cn.asto.Interator;
public class LinkedList implements List{
private Node head = null; //头节点
private Node tail = null;//尾节点
private int size = 0;
@Override
public void add(Object o){
Node n = new Node(o,null);
if(head==null){
head = n;
tail = n;
}else{
tail.setNext(n);
tail = n;
}
size ++;
}
public int size(){
return size;
}
@Override
public Iterator iterator() {
// TODO Auto-generated method stub
return new linkedIterator();
}
private class linkedIterator implements Iterator{
private Node currentNode;
@Override
public boolean hasNext() {
if(currentNode == tail) return false;
return true;
}
@Override
public Object next() {
if(currentNode==null){
currentNode = head;
}else {
currentNode = currentNode.getNext();
}
return currentNode.getData();
}
}
}
Test:
package cn.asto.Interator;
public class Test {
public static void main(String args[]){
List a = new LinkedList();
int i = 11;
while(i-->0){
a.add(new Object());
}
Iterator ite = a.iterator();
while(ite.hasNext()){
Object o = ite.next();
System.out.println(o);
}
}
}
设计模式之Iterator模式(2)的更多相关文章
- 设计模式之Iterator模式
STL里的iterator就是应用了iterator模式. 一.什么是迭代模式 Iterator模式也叫迭代模式,是行为模式之一,它把对容器中包含的内部对象的访问委让给外部类,使用Iterator按顺 ...
- Java设计模式之Iterator模式
分类: [java]2013-07-15 10:58 917人阅读 评论(0) 收藏 举报 所谓Iterator模式,即是Iterator为不同的容器提供一个统一的访问方式.本文以java中的容器为例 ...
- 设计模式—迭代器Iterator模式
什么是迭代器模式? 让用户通过特定的接口访问容器的数据,不需要了解容器内部的数据结构. 首先我们先模仿集合中ArrayList和LinkedList的实现.一个是基于数组的实现.一个是基于链表的实现, ...
- 设计模式——迭代器(Iterator)模式
概述 迭代器模式简单的说(按我目前的理解)就是一个类提供一个对外迭代的接口,方面调用者迭代.这个迭代接口至少包括两个方法:hasNext()--用于判断是否还有下一个,next()--用于取出下一个对 ...
- 设计模式:Iterator模式
目的:将数据的存储和数据的查询分开,降低数据的耦合性 继承关系图: 例子: //定义迭代器接口 template<typename T> class Iterator { public: ...
- 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern)
原文:乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 迭代器模式(Iterator Pattern) 作者:weba ...
- Java设计模式(12)迭代模式(Iterator模式)
上了这么多年学,我发现一个问题,好象老师都很喜欢点名,甚至点名都成了某些老师的嗜好,一日不点名,就饭吃不香,觉睡不好似的,我就觉得很奇怪,你的课要是讲的好,同学又怎么会不来听课呢,殊不知:“误人子弟, ...
- 设计模式学习--迭代器模式(Iterator Pattern)和组合模式(Composite Pattern)
设计模式学习--迭代器模式(Iterator Pattern) 概述 ——————————————————————————————————————————————————— 迭代器模式提供一种方法顺序 ...
- 【设计模式大法】Iterator模式
Iterator模式 --一个一个遍历 在Java中的for语句中 i++的作用是让 i 的值在每次循环后自增1,这样就可以访问数组中的下一个元素.下下一个元素.再下下一个元素,也就实现了从头至尾逐一 ...
随机推荐
- latextools \cite 自动补全
最近在用latex写毕业论文,编辑环境用的是Sublime Text 2 加 latextools 插件,在使用latextools的\cite命令来引用参考文献时,我们希望输入\cite{ 后自动弹 ...
- linux系统date命令详解
Linux时钟分为系统时钟(System Clock)和硬件(Real Time Clock,简称RTC)时钟.系统时钟是指当前Linux Kernel中的时钟,而硬件时钟则是主板上由电池供电的时钟, ...
- 用node开发repl应用
前言 每次看到一些库npm -g install xx然后,执行xx就可以跑起来,这不就是一个shell工具了吗,那么我不就可以不用学习shell语法,直接用js写命令行脚本了吗! 什么是REPL应用 ...
- 闲聊Redshift与日本CG行业的近况
最近不少朋友跟我说Redshift如何如何,恰巧我目前工作的工作室花费了巨资购买了Redshift和Quadro M4000,妄图在艺术家工作站上做一个新的动画项目,把渲染时间控制在15分钟以下.结果 ...
- Python中使用自定义类class作为海量数据结构时内存占用巨大的问题
最近碰到处理一个二十多兆的文件时内存蹭蹭的吃掉四百多兆,吓死宝宝了. 无奈毕竟接触python时间有限,还没有完整的看过python的一些基础知识,我想一个合格的pythoner应该不会碰到这个问题. ...
- Spark使用总结与分享
背景 使用spark开发已有几个月.相比于python/hive,scala/spark学习门槛较高.尤其记得刚开时,举步维艰,进展十分缓慢.不过谢天谢地,这段苦涩(bi)的日子过去了.忆苦思甜,为了 ...
- 美行Thinkpad八通道快捷入口
美行Thinkpad八通道快捷入口 链接: http://shop.lenovo.com/perksoffer/us/en/laptops/thinkpad/?__followRobots=true打 ...
- cmd窗口编码方式的修改
cmd默认的编码是采用GBK regedit HKEY_CURRENT_USER\Console\%SystemRoot%_system32_cmd.exe\CodePage 十进制:936 GB ...
- 基于HTML5的Web跨设备超声波通信方案
前言:Chirp在iPhone上掀起了有声传输文件的序幕,我们再也不需要彩信.蓝牙配对.IM来传送数据.它通过“叽叽喳喳”的小鸟叫声来分享数据,简单有趣,而且可以快速的实现一对多的分享. 此外支付宝曾 ...
- Auto CAD 2013的故障解决方法
一.问题的提出 Auto CAD 2013在使用过程中出现了错误:“安全系统(软件锁许可管理器) 不起作用或未正确安装.” 二.问题的分析 网络上很多地方转载了这么一个方法: 1) 启动Windows ...