java迭代子模式详解

迭代子(Iterator)模式的结构:
迭代子模式可以顺序访问一个聚集中的元素而不必暴露聚集的内部表象。
迭代子可分为外禀迭代子内禀迭代子
外禀迭代子:适合于白箱聚集(白箱聚集就是向外界提供访问自己内部元素接口的聚集),由于迭代的逻辑是由聚集对象本身提供的,所以这样的外禀迭代子角色往往仅仅保持迭代的游标位置。所以具体迭代子角色是一个外部类,它的构造函数接受一个具体聚集对象,从而可以调用这个聚集对象的迭代逻辑。
内禀迭代子:适用于黑箱聚集(黑箱聚集不向外部提供遍历自己元素对象的接口),由于黑箱聚集的元素对象只可以被聚集内部成员访问,所以内禀迭代子只能是聚集内部的成员子类。
简单示范:

package test.edu.inter; 

public interface IteratorObj { 

  /**
  * 移动到第一个元素
  */
 public void first();
 /**
  * 移动到下一个元素
  */
 public boolean hasNextItem();
 /**
  * 返还当前元素
  */
 public Object currentItem(); 

} 

package test.edu.inter; 

public interface DataSet {
 public IteratorObj getIterator();
} 

package test.edu.inter; 

public class Iterator1 implements IteratorObj { 

 private Dataobj set;
 private int size;
 private int index=0; 

 public Iterator1(Dataobj set){
  this.set = set;
  this.size = set.getSize();
 } 

 @Override
 public void first() {
  // TODO Auto-generated method stub
  this.index = 0;
 } 

 @Override
 public boolean hasNextItem() {
  if(index<size){
   return true;
  }
  return false;
 } 

 @Override
 public Object currentItem() {
  Object ob = set.getItem(index);
  if(index<size){
   index++;
  }
  return ob;
 }
} 

package test.edu.inter; 

public class Dataobj implements DataSet { 

 private Object[] objArray = null;
  /**
   * 传入聚合对象
   */
 public Dataobj(Object[] objArray){
   this.objArray = objArray;
  } 

 @Override
 public IteratorObj getIterator() {
  return new Iterator1(this);
 } 

 public Object getItem(int index){
  return objArray[index];
 }
 public int getSize(){
  return objArray.length;
 }
} 

package test.edu.inter; 

public class Client { 

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  String[] str={"12312","dasda","dasd","12d","asd"};
  Dataobj ao = new Dataobj(str);
  IteratorObj io = ao.getIterator();
  while(io.hasNextItem()){
   System.out.println(io.currentItem());
  }
 }
}

运行结果:

12312
dasda
dasd
12d
asd

内容扩充:在java聚集中的应用
在java.util.Collection接口提供iterator()工厂方法返回一个Iterator类型对象,Collection接口的子类型AbstractList类的内部成员类Itr实现Iterator接口。所以Itr是内禀迭代子类,但是AbstractList也提供了自己的遍历方法,所以它不是黑箱聚集,而是白箱聚集。其代码如下:

import java.util.Iterator;
public interface Itr extends Iterator{
   //再次调用next()方法时所用的指标
   int cursor = 0;
   //最近一次调用时所用的指标
   int lastRet = -1;
   int expectedModCount = modCount;
   public boolean hasNext(){
     return cursor!=size();
   }
   public Object next(){
     try{
       Object next = get(cursor);
       checkForComodification();
       lastRet = cursor++;
       return next;
     }catch(IndexOutOfBoundsException e){
       checkForComodification();
       throw new NoSuchElementException();
     }
   }
   //删除最后遍历过的元素,remove()方法只能删除最后遍历的元素
   public void remove(){
     if(lastRet ==-1)
       throw new IllegalStateException();
     checkForComodification();
     try{
       AbstractList.this.remove(lastRet);
       if(lastRet<cursor)
          cursor--;
       lastRet = -1;
       expectedModCount = modCount;
     }catch(IndexOutOfBoundsException e){
       throw new ConcurrentModificationException();
     }
   }
   public void checkForComodification(){
     if(modCount!=expectedModCount)
       throw new ConcurrentModificationException();
   }
}

其中的modCount、get(cursor)等变量和方法均是AbstractList类所拥有,Itr可以直接使用。方法checkForComodification()会检查聚集的内容是否刚刚被外界直接修改过(不是通过迭代子提供的remove()方法修改的)。如果在迭代子开始后,聚集的内容被外界绕过迭代子对象而直接修改过年话,这个方法立即抛出异常。
另外:AbstractList类也提供了listIterator()方法,返回一个实现了Listiterator接口的类ListItr实例。ListIterator接口实现了正向迭代和逆向迭代,同时还提供了在迭代过程当中安全修改列的内容的方法。
Enumeration与Iterator的区别:(1)Enumeration没有remove方法(2)Enumeration是在Vector中的element()方法中作用一个无名类实现的,它不支付Fail Fast,也就是说在迭代过程中,聚集对象被外界意外直接修改,则这个迭代过程还会立即捕获任何异常。

以上就是本文的全部内容,希望对大家的学习有所帮助。

(0)

相关推荐

  • Java设计模式之模板模式(Template模式)介绍

    Template模式定义:定义一个操作中算法的骨架,将一些步骤的执行延迟到其子类中. 其实Java的抽象类本来就是Template模式,因此使用很普遍.而且很容易理解和使用,我们直接以示例开始: 复制代码 代码如下: public abstract class Benchmark { /** * 下面操作是我们希望在子类中完成 */ public abstract void benchmark(); /** * 重复执行benchmark次数 */ public final long repea

  • Java设计模式之迭代模式(Iterator模式)介绍

    上了这么多年学,我发现一个问题,好象老师都很喜欢点名,甚至点名都成了某些老师的嗜好,一日不点名,就饭吃不香,觉睡不好似的,我就觉得很奇怪,你的课要是讲的好,同学又怎么会不来听课呢,殊不知:"误人子弟,乃是犯罪!"啊. 好了,那么我们现在来看老师这个点名过程是如何实现吧: 1.老规矩,我们先定义老师(Teacher)接口类: 复制代码 代码如下: public interface Teacher {     public Iterator createIterator(); //点名 }

  • java设计模式之建造者模式学习

    1 概述建造者模式(Builder Pattern)主要用于"分步骤构建一个复杂的对象",在这其中"分步骤"是一个稳定的算法,而复杂对象的各个部分则经常变化.因此, 建造者模式主要用来解决"对象部分"的需求变化. 这样可以对对象构造的过程进行更加精细的控制. 2 示例以生产手机为例,每个手机分为屏幕Screen.CPU.Battery.现在要生产两种手机,苹果机和三星. 苹果: 复制代码 代码如下: package org.scott.build

  • Java设计模式之责任链模式简介

    对于使用过宏的朋友应该知道,利用宏可以实现一个键绑定多个技能.例如如果排在前面的技能有CD,则跳过此技能,执行之后的技能.记得曾经玩DK,打怪的时候,就是用一个键,一直按就行了.在servlet里的doGet和doPost方法,我们一般都把doGet请求发动到doPost里来处理,这也是一种责任链的模式. 这里,有个宏,绑定了"冰血冷脉"和"寒冰箭"两个技能,程序实例如下所示: package responsibility; /** * DOC 技能接口,要绑定的技

  • Java单例模式的应用示例

    单例模式用于保证在程序的运行期间某个类有且仅有一个实例.其优势在于尽可能解决系统资源.通过修改构造方法的访问权限就可以实现单例模式. 代码如下: 复制代码 代码如下: public class Emperor {    private static Emperor emperor = null;// 声明一个Emperor类的引用 private Emperor() {// 将构造方法私有    } public static Emperor getInstance() {// 实例化引用   

  • Java设计模式之装饰者模式详解和代码实例

    装饰者模式可以给已经存在的对象动态的添加能力.下面,我将会用一个简单的例子来演示一下如何在程序当中使用装饰者模式. 1.装饰者模式 让我们来假设一下,你正在寻找一个女朋友.有很多来自不同国家的女孩,比如:美国,中国,日本,法国等等,他们每个人都有不一样的个性和兴趣爱好,如果需要在程序当中模拟这么一种情况的话,假设每一个女孩就是一个Java类的话,那么就会有成千上万的类,这样子就会造成类的膨胀,而且这样的设计的可扩展性会比较差.因为如果我们需要一个新的女孩,就需要创建一个新的Java类,这实际上也

  • java单例模式使用及注意事项

    1. 说明 1)单例模式:确保一个类只有一个实例,自行实例化并向系统提供这个实例 2)单例模式分类:饿单例模式(类加载时实例化一个对象给自己的引用),懒单例模式(调用取得实例的方法如getInstance时才会实例化对象)(java中饿单例模式性能优于懒单例模式,c++中一般使用懒单例模式) 3)单例模式要素: a)私有构造方法b)私有静态引用指向自己实例c)以自己实例为返回值的公有静态方法 2.实例 饿单例模式: 复制代码 代码如下: package com.wish.modedesign;

  • 代理模式之Java动态代理实现方法

    今天一个偶然的机会我突然想看看JDK的动态代理,因为以前也知道一点,而且只是简单的想测试一下使用,使用很快里就写好了这么几个接口和类:接口类:UserService.java 复制代码 代码如下: package com.yixi.proxy;public interface UserService {    public int save() ;    public void update(int id);} 实现类:UserServiceImpl.java 复制代码 代码如下: packag

  • Java中的观察者模式实例讲解

    观察者模式是一种行为设计模式.观察者模式的用途是,当你对一个对象的状态感兴趣,希望在它每次发生变化时获得通知.在观察者模式中,观察另外一个对象状态的对象叫做Observer观察者,被观察的对象叫着Subject被观察者.根据GoF规则,观察者模式的意图是: 复制代码 代码如下: 定义对象之间一对多的依赖关系,一个对象状态改变,其他相关联的对象就会得到通知并被自动更新. Subject(被观察者)包含了一些需要在其状态改变时通知的观察者.因此,他应该提供给观察者可以register(注册)自己和u

  • JAVA实现单例模式的四种方法和一些特点

    一.饿汉式单例类 复制代码 代码如下: public class Singleton  {      private Singleton(){ } private static Singleton instance = new Singleton(); private static Singleton getInstance(){          return instance;      }  } 特点:饿汉式提前实例化,没有懒汉式中多线程问题,但不管我们是不是调用getInstance()

随机推荐