设计模式之Interator模式(1)
interator是java容器遍历的一种手段,当然遍历容易你可以使用普通的for(;;)或者for(Object o : new Arraylist<Object>()),都是可以的。
先来看看JDK容器是怎么实现的吧,首先看看ArrayList,它有海纳百川的肚量,似乎找不到他的边,它可以bigger than bigger,有想过为什么么?
为什么叫ArrayList,不叫DogList,因为ArrayList封装了一个数组,当向这个List中添加东西的时候,其实就是往数组里面加东西,先去判断这个数组是不是已经满了,如果是,就再生成一个更大的数组,把原数组的东西移动到新生成的数组上面,再去添加新的东西。所以,ArrayList肯定性能上比不上Array,因为你每次都要新生成一个新的数组,还需要move,但是人家不需要指定大小,所以还是比较受欢迎一点!
这里我忽略泛型的用法,用code来描述一个简单的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;
}
}
}
不难吧?知道原理的话,看看觉得也就这样子。
来个难点的?LinkedList:
Thinking....
给答案:
Node.java:
package cn.asto.Interator;
public class Node {
private Node next;//下一个节点的引用
private Object data;//存数据
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
public Node(Object data,Node next) {
super();
this.next = next;
this.data = data;
}
}
LinkedList.java:
package cn.asto.Interator;
public class LinkedList {
private Node head = null; //头节点
private Node tail = null;//尾节点
private int size = 0;
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;
}
}
当然这个集合当然没有JDK所有的方法,我只是简单模拟了一下,为了方便Interator的模式学习。
上面的实现最好可以面向接口去编程,去约束方法名字,变得规范,父类引用子类对象。面向接口编程还有一个好处,可替换性。
比如你可以新建一个List接口:
package cn.asto.Interator;
public interface List {
public void add(Object o);
public int size();
public Iterator iterator();
}
让ArrayList和LinkedList去实现它就可以了。
设计模式之Interator模式(1)的更多相关文章
- 每天一个设计模式-7 生成器模式(Builder)
每天一个设计模式-7 生成器模式(Builder) 一.实际问题 在讨论工厂方法模式的时候,提到了一个导出数据的应用框架,但是并没有涉及到导出数据的具体实现,这次通过生成器模式来简单实现导出成文本,X ...
- 每天一个设计模式-2 外观模式(Facade)
每天一个设计模式-2 外观模式(Facade) 1.生活中的示例 客户想要购买一台电脑,一般有两种方法: 1.自己DIY,客户需要知道组成电脑的所有电子器件,并且需要熟悉那些配件,对客户要求较高. ...
- Java设计模式之建造者模式(Builder)
前言: 最近一直在学习okHttp,也对其做了一些整理,okHttp和Retrofit结合大大加速我们的开发效率,源码里面采用了很多设计模式,今天我们来学习一下其中的设计模式之一建造者模式. 建造者模 ...
- [Head First设计模式]云南米线馆中的设计模式——模版方法模式
系列文章 [Head First设计模式]山西面馆中的设计模式——装饰者模式 [Head First设计模式]山西面馆中的设计模式——观察者模式 [Head First设计模式]山西面馆中的设计模式— ...
- 设计模式——抽象工厂模式及java实现
设计模式--抽象工厂模式及java实现 设计模式在大型软件工程中很重要,软件工程中采用了优秀的设计模式有利于代码维护,方便日后更改和添加功能. 设计模式有很多,而且也随着时间在不断增多,其中最著名的是 ...
- 设计模式-14 MVC模式
一 MVC设计模式 MVC 模式代表 Model-View-Controller(模型-视图-控制器) 模式,它是一个存在于服务器 表达层的模型,它将应用分开,改变应用之间的高度耦合 MVC设计模式将 ...
- 设计模式_11_原型模式(prototype)深拷贝、浅拷贝
设计模式_11_原型模式(prototype) 浅拷贝: package designPatternOf23; /** * 定义:用原型实例,指定创建对象的种类,并通过拷贝这些原型创建新的对象 * P ...
- 17. 星际争霸之php设计模式--职责链模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
- 11. 星际争霸之php设计模式--备忘模式
题记==============================================================================本php设计模式专辑来源于博客(jymo ...
随机推荐
- AngularJS和DataModel
通常,在AngularJS中使用JSON作为存储数据的模型.我们可能这样在controller中写model: app.controller('BookController',['$scope',fu ...
- 【转】升级Xcode6.3插件失效解决办法
1.打开终端,输入以下代码获取到DVTPlugInCompatibilityUUID defaults read /Applications/Xcode.app/Contents/I ...
- Skyline6.5系列覆盖三维地理信息产业上下游
SkylineGlobe将于近日推出6.5 系列产品.该系列产品提供从产业链上游影像处理.中游二三维展示分析.下游具体业务应用等覆盖整个三维空间地理信息产业链的一体化.一站式产品与服务. Skylin ...
- jquery.jqzoom.js图片放大镜
jqzoom插件实现图片放大镜效果 1. jquery.jqzoom.js //************************************************************ ...
- 服务器断电,Oracle数据库无法启动解决方案
数据库没有备份的情况下,数据库所在服务器由于意外断电,导致服务器启动之后,Oracle数据库startup报错. 1. 数据库没开归档模式 2. 无备份 解决方案: 1 2 3 4 5 6 7 8 9 ...
- Excel 二级下拉菜单
http://jingyan.baidu.com/article/cd4c2979f31967756f6e6066.html http://hi.baidu.com/chenshake/item/e1 ...
- 关于VS2010出现“此方法显式使用的 CAS 策略已被 .NET Framework 弃用... ...请使用 NetFx40_LegacySecurityPolicy 配置开关”解决办法
有时候VS会出现“此方法显式使用的 CAS 策略已被 .NET Framework 弃用.若要出于兼容性原因而启用 CAS 策略,请使用 NetFx40_LegacySecurityPolicy 配置 ...
- [知识库分享系列] 二、.NET(ASP.NET)
最近时间又有了新的想法,当我用新的眼光在整理一些很老的知识库时,发现很多东西都已经过时,或者是很基础很零碎的知识点.如果分享出去大家不看倒好,更担心的是会误人子弟,但为了保证此系列的完整,还是选择分享 ...
- SQLServer2008新建链接服务器for Oracle
SQLServer2008新建链接服务器for Oracle 最近要在SQLServer2008中使用Oracle 10g的一个视图,通过建立链接服务器即可在SQLServer中使用Oracle提 ...
- [Compose] 20. Principled type conversions with Natural Transformations
We learn what a natural transformation is and see the laws it must obey. We will see how a natural t ...