Iterator 迭代模式

本文介绍迭代模式的基本概念,通过实例展示了如何使用迭代模式遍历集合,同时保持内部数据结构的隐藏。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

模式定义

 

迭代模式提供了一种方法顺序用来访问一个聚合对象中的各个元素, 而又不需暴露该对象的内部表示。如今该模式已被java集成到了util类库中,我们常常可以同过Collection接口以及其下的Iterator来进行集合遍历的操作。

使用方法

 

迭代模式使用next或者previous等的方法提供给外部一种可遍历的功能。

使用范围

 

  • 访问一个聚合对象的内容而无需暴露它的内部表示。
  • 支持对聚合对象的多种遍历。
  • 为遍历不同的聚合结构提供一个统一的接口(即, 支持多态迭代)。

举例说明

 

假设现在有一个DVD库,提供给外界的功能是顺序地可以访问这个库中的每一个DVD,它不提供增加和删除功能,只要求访问。如此可以定义一个接口暴露给外界DvdListIterator。

public interface DvdListIterator {
	   public void first();
	   public void next();  
	   public boolean isDone();
	   public String currentItem();
	}

而DVD库本身的增加或删除修改的操作交给内部DvdList完成,同时提供createIterator()方法返回DvdListIterator的一个实现给外部访问,该实现为DvdList的一个只读类,隐藏了DvdList的内部对象的实现:InnerIterator 。是不是有点像java.util中的Collection.iterater()方法呢?该方法交由外部进行遍历访问。

public class DvdList {  
	   private String[] titles;  
	   private int titleCount;
	   private int arraySize;

	   public DvdList() {
	        titles = new String[3];    
	        titleCount = 0;
	        arraySize = 3;
	   }    

	   public int count() {
	       return titleCount;
	   }

	   public void append(String titleIn) {
	       if (titleCount >= arraySize) {
	           String[] tempArray = new String[arraySize];
	           for (int i = 0; i < arraySize; i++){
	        	   tempArray[i] = titles[i];
	           }
	           titles = null;
	           arraySize = arraySize + 3;           
	           titles = new String[arraySize];
	           for (int i = 0; i < (arraySize - 3); i++) {
	               titles[i] = tempArray[i];
	           }
	       }
	       titles[titleCount++] = titleIn; 
	   }

	   public void delete(String titleIn) {
	       boolean found = false;
	       for (int i = 0; i < (titleCount -1); i++) {
	           if (found == false) {
	               if (titles[i].equals(titleIn)) {
	                   found = true;
	                   titles[i] = titles[i + 1];
	               }
	           } else {
	               if (i < (titleCount -1)) {
	                   titles[i] = titles[i + 1];
	               } else {
	                   titles[i] = null;
	               }
	           }
	       }

	       if (found == true) {
	           --titleCount;
	       }
	   }


	   public DvdListIterator createIterator() {
	       return new InnerIterator();
	   }


	   private class InnerIterator implements DvdListIterator {
	       private int currentPosition = 0;

	       private InnerIterator() {}

	       public void first() {
	           currentPosition = 0;
	       }

	       public void next() {
	           if (currentPosition < (titleCount)) {
	               ++currentPosition;
	           }
	       }

	       public boolean isDone() {
	           if (currentPosition >= (titleCount)) {
	               return true;
	           } else {
	               return false;
	           }
	       }

	       public String currentItem() {
	           return titles[currentPosition];
	       }
	   }
	}

接下来,观察外部如何访问DvdList并遍历它内部的所有对象:

	       DvdListIterator dvdMoviesIterator = 
	         dvdMovies.createIterator();
public class IteratorClient {
	public static void main(String[] args) {
	       DvdList dvdMovies = new DvdList();
	       dvdMovies.append("Movie 1");
	       dvdMovies.append("Movie 2");
	       dvdMovies.append("Movie 3");
	       dvdMovies.append("Movie 4");
	       dvdMovies.append("Movie 5");
	       dvdMovies.append("Movie 6");

	       DvdListIterator dvdMoviesIterator = 
	         dvdMovies.createIterator();
	       while (!dvdMoviesIterator.isDone()) {
	           System.out.println(dvdMoviesIterator.currentItem());
	           dvdMoviesIterator.next();  
	       }

	       dvdMovies.delete("Movie 4");

	       System.out.println(" ");   
	       dvdMoviesIterator.first();       
	       while (!dvdMoviesIterator.isDone()) {
	           System.out.println(dvdMoviesIterator.currentItem());
	           dvdMoviesIterator.next();  
	       }       
	   }

}

运行结果

Movie 1
Movie 2
Movie 3
Movie 4
Movie 5
Movie 6

Movie 1
Movie 2
Movie 3
Movie 5
Movie 6

下载示例

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值