日拱一卒(四十一)

迭代器模式(Iterator):提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露对象的内部表示。

  • 白话:java中的iterator就是这样的模型,聚合对象不暴露自己内部的数据组合,而是将遍历任务交给iterator,iterator固定提供几个遍历用到的方法给client。
  • 角色:(1)聚合类:被迭代器访问的聚合类;
      (2)迭代器:遍历聚合类的操作类;

注:迭代器提供的方法:

First()------聚合类中的遍历的第一个元素;这里不一定是聚合类的第一个元素;这里有点绕;举个例子:比如聚合类存放的是一个数组;而遍历的却是从最后往前的,则First()则是最后一个元素;因此First()跟遍历的具体实现有关;

Next()------遍历时的下一个元素;

IsDone()----遍历是否结束;

CurrentItem()-----遍历时当前的元素;

  •  使用场景:对一个聚合的所有元素进行遍历时,考虑迭代器模式。
  •  示例:
    迭代类:
    interface Iterator<T> {
    	public T first();
    
    	public T next();
    
    	public boolean isDone();
    
    	public T currentItem();
    }
    聚合类:
    class MilkBox {
    	private List<Milk> milks = new ArrayList<Milk>();
    
    	public enum IteratorType {
    		MilkIterator, MilkIteratorDec;
    	}
    
    	private class Milk {
    		private String name;
    
    		public Milk(String name) {
    			super();
    			this.name = name;
    		}
    	}
    
    	public void putMilk(String name) {
    		Milk milk = new Milk(name);
    		milks.add(milk);
    	}
    
    	public Iterator<String> iterator(IteratorType type) {
    		switch (type) {
    			case MilkIterator:
    				return new MilkIterator();
    			case MilkIteratorDec:
    				return new MilkIteratorDec();
    			default:
    				break;
    		}
    		return null;
    	}
    
    	class MilkIterator implements Iterator<String> {
    		private int current;
    
    		@Override
    		public String first() {
    			current = 0;
    			return currentItem();
    		}
    
    		@Override
    		public String next() {
    			String ret = null;
    			current++;
    			if (!isDone()) {
    				ret = milks.get(current).name;
    			}
    			return ret;
    		}
    
    		@Override
    		public boolean isDone() {
    			return current >= milks.size();
    		}
    
    		@Override
    		public String currentItem() {
    			return milks.get(current).name;
    		}
    	}
    
    	class MilkIteratorDec implements Iterator<String> {
    		private int current;
    
    		@Override
    		public String first() {
    			current = milks.size() - 1;
    			if (current > 0)
    				return currentItem();
    			else
    				return null;
    		}
    
    		@Override
    		public String next() {
    			String ret = null;
    			current--;
    			if (!isDone()) {
    				ret = milks.get(current).name;
    			}
    			return ret;
    		}
    
    		@Override
    		public boolean isDone() {
    			return current < 0;
    		}
    
    		@Override
    		public String currentItem() {
    			return milks.get(current).name;
    		}
    	}
    测试类:
    public class IteratorTest {
    	public static void main(String[] args) {
    		MilkBox milkBox = new MilkBox();
    		milkBox.putMilk("蒙牛");
    		milkBox.putMilk("伊利");
    		milkBox.putMilk("特仑苏");
    		milkBox.putMilk("六个核桃");
    		Iterator<String> iterator = milkBox.iterator(IteratorType.MilkIterator);
    		for (iterator.first(); !iterator.isDone(); iterator.next()) {
    			System.out.println("" + iterator.currentItem());
    		}
    		System.out.println();
    		iterator = milkBox.iterator(IteratorType.MilkIteratorDec);
    		for (iterator.first(); !iterator.isDone(); iterator.next()) {
    			System.out.println("" + iterator.currentItem());
    		}
    	}
    }

output:

注:(1)对于客户端(测试类)而言,milk这个类是透明的(不可见的),而milkbox是如何组合这些数据也是透明的(即milkbox用的list还是数组或其他数据结构,客户端是不可见的)。

       (2)迭代类存在两种,正向迭代和逆向迭代,当然也可以定制化自己的迭代。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值