zoukankan      html  css  js  c++  java
  • Java 实现迭代器(Iterator)模式

    类图


    /**
     * 自己定义集合接口, 相似java.util.Collection
     * 用于数据存储
     * @author stone
     *
     */
    public interface ICollection<T> {
    	
    	IIterator<T> iterator(); //返回迭代器
    	void add(T t);
    	T get(int index);
    }

    /**
     * 自己定义迭代器接口 相似于java.util.Iterator
     * 用于遍历集合类ICollection的数据
     * @author stone
     *
     */
    public interface IIterator<T> {
    	boolean hasNext();
    	boolean hasPrevious();
    	T next();
    	T previous();
    }

    /**
     * 集合类, 依赖于MyIterator
     * @author stone
     */
    public class MyCollection<T> implements ICollection<T> {
    
    	private T[] arys;
    	private int index = -1;
    	private int capacity = 5;
    	
    	public MyCollection() {
    		this.arys = (T[]) new Object[capacity];
    	}
    	
    	@Override
    	public IIterator<T> iterator() {
    		return new MyIterator<T>(this);
    	}
    	
    	@Override
    	public void add(T t) {
    		index++;
    		if (index == capacity) {
    			capacity *= 2;
    			this.arys = Arrays.copyOf(arys, capacity);
    			
    		}
    		this.arys[index] = t;
    	}
    	
    	@Override
    	public T get(int index) {
    		return this.arys[index];
    	}
    	
    }

    /*
     * 迭代器(Iterator)模式 又叫做游标(Cursor)模式
     * 提供一种方法訪问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。
     * Iterator模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既能够做到不暴露集合的内部结构,又可让外部代码透明的訪问集合内部的数据
     * 
     * 若有新的存储结构,可new 一个ICollection, 相应的 new 一个IIterator来实现它的遍历
     */
    @SuppressWarnings({"rawtypes", "unchecked"})
    public class Test {
    	public static void main(String[] args) {
    		ICollection<Integer> collection = new MyCollection<Integer>();
    		add(collection, 3, 5, 8, 12, 3, 3, 5);
    		for (IIterator<Integer> iterator = collection.iterator(); iterator.hasNext();) {
    			System.out.println(iterator.next());
    		}
    		
    		System.out.println("-------------");
    		
    		ICollection collection2 = new MyCollection();
    		add(collection2, "a", "b", "c", 3, 8, 12, 3, 5);
    		for (IIterator iterator = collection2.iterator(); iterator.hasNext();) {
    			System.out.println(iterator.next());
    		}
    		
    	}
    	
    	static <T> void  add(ICollection<T> c, T ...a) {
    		for (T i : a) {
    			c.add(i);
    		}
    	}
    }

    打印

    3
    5
    8
    12
    3
    3
    5
    -------------
    a
    b
    c
    3
    8
    12
    3
    5
    





  • 相关阅读:
    如何实现LRU缓存淘汰算法
    排序算法(上)
    MySQL为什么有时候会选错索引?
    mysql开启慢查询——wamp
    普通索引和唯一索引,应该如何选择
    php开发常用插件
    mysql批量添加大量测试数据
    .text()设置文本,.html()设置html, .val()设置值的使用
    ajax .load()方法
    jquery学习笔记一之window.onload与$(document).ready()区别
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4359834.html
Copyright © 2011-2022 走看看