デザインパターン14、イテレーターパターン

イテレータモードは、コレクションオブジェクトの基になる表現を知らなくても、一貫したメソッドを使用してコレクション要素をトラバースするための統一されたインターフェイスを提供します。つまり、内部構造を公開しません。


非表示の内部クラスのタイプの役割は
プライベートメンバーを含む、そのクラスの無制限の外部メンバーにアクセスできます。

/ *
*内部クラス(内部クラス)
*定義:クラス、メソッド本体、インターフェイスで定義されたクラス
*関数
*型の非表示に使用
*内部クラスは、プライベートメンバーを含む外部クラスのメンバーに無制限にアクセスできます
* /

/ *イテレータモード(イテレータ):アクセスアクションの抽象化

  • 下部に保存されているデータのコレクション:配列(int)、プライベート、外部から直接アクセスできない
  • プライベート内部クラスを介してイテレータを実装する
  • 名前付き内部クラス
  • 匿名の内部クラス
    * /
//迭代器接口
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());
}

おすすめ

転載: blog.csdn.net/weixin_45401129/article/details/114629486