设计模式 十四、迭代器模式

本文介绍迭代器模式的应用及内部类的特性。通过具体代码示例,展示了如何使用迭代器模式来遍历集合元素,并利用内部类隐藏类型实现对外部类成员的访问。

迭代器模式,提供一种遍历集合元素的统一接口,用一致的方法遍历集合元素,不需要知道集合对象的底层表示,即:不暴露其内部的结构

作用
用于类型的隐藏
内部类可以无限制访问其外部类的成员,包括private成员

/*
*内部类(inner class)
*定义:定义在类、方法体、接口中的class
*作用
*用于类型的隐藏
*内部类可以无限制访问其外部类的成员,包括private成员
*/

/*迭代器模式(iterator):对访问动作的抽象

  • 底层存放数据的集合:数组(int),私有的,外界不能直接访问
  • 通过private内部类的方式实现迭代器
  • 有名字的内部类
  • 匿名内部类
    */
//迭代器接口
public interface Iterator {
	int current();
	int next();
	boolean isFinish();
}


public class Sequence {
	private int[] data;
	private int cur;
	
	public Sequence(int n) {
		data = new int[n];
		for (int k = 1; k <= n; k++) data[k-1] = k;
	}
	
	//返回一个接口,让外界按指定的顺序读取data
	public Iterator iterator() {
		cur = 0;
		return new NormalIterator();
	}
	
    	//顺序访问,类型隐藏,DAO
	private class NormalIterator implements Iterator {
		@Override
		public int current() {
			return data[cur];
		}
		@Override
		public int next() {
			if (cur < data.length) cur++;
			if (isFinish()) return -1;
			return data[cur];
		}
		@Override
		public boolean isFinish() {
			return (cur == data.length);
		}
	}
	
	//逆序访问,在方法中定义的匿名内部类
	public Iterator invIterator() {
		cur = data.length - 1;
		//改为用在方法中定义的匿名内部类实现
		return new Iterator() {
			@Override
			public int current() {
				return data[cur];
			}
			@Override
			public int next() {
				if (cur >=0) cur--;
				if (isFinish()) return -1;
				return data[cur];
			}
			@Override
			public boolean isFinish() {
				return (cur == -1);
			}
		};
	}

    
}

public static void main(String[] args) {
		Sequence s = new Sequence(20);
		//Iterator iter = s.iterator();
		
		Iterator iter = s.invIterator();
		
		do {
			System.out.print(iter.current() + " ");
			iter.next();
		} while (!iter.isFinish());
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值