• Iterator


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

    当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,你应该考虑迭代模式。为遍历不同的聚集结构提供如 开始、下一个、是否结束、目前哪一个 等统一接口。

    迭代模式分离了对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可以让外部代码透明地访问集合内部数据。

    1 public abstract class Iterator {
    2 //用于定义得到开始对象,得到下一个对象,是否到结尾,当前对象等方法,统一接口。
    3 public abstract Object getFirst();
    4 public abstract Object next();
    5 public abstract boolean isDone() ;
    6 public abstract Object getCurrentItem();
    7 }
    1 public abstract class Aggregate {
    2 //创建迭代器
    3 public abstract Iterator createIterator();
    4 }
     1 public class ConcreteAggregate extends Aggregate{
    2
    3 //声明一个List变量,用于存放聚合对象。
    4 private List<Object> items = new ArrayList<Object>();
    5
    6 @Override
    7 public Iterator createIterator() {
    8 return new ConcreteIterator(this);
    9 }
    10
    11 //返回聚集总个数
    12 public Object getItem(int index){
    13 return items.get(index);
    14 }
    15
    16 public void setItem(int index, Object obj){
    17 items.add(index, obj);
    18 }
    19
    20 public void setItem(Object obj){
    21 items.add(obj);
    22 }
    23
    24 public int getCount(){
    25 return items.size() ;
    26 }
    27 }
     1 public class ConcreteIterator extends Iterator{
    2
    3 //定义一个具体聚集对象
    4 private ConcreteAggregate aggregate ;
    5 private int current = 0 ;
    6
    7 public ConcreteIterator(ConcreteAggregate aggregate){
    8 this.aggregate = aggregate ;
    9 }
    10
    11 @Override //得到当前对象
    12 public Object getCurrentItem() {
    13 return aggregate.getItem(current);
    14 }
    15
    16 @Override //得到第一个对象
    17 public Object getFirst() {
    18 return aggregate.getItem(0);
    19 }
    20
    21 @Override //是否已结尾
    22 public boolean isDone() {
    23 return current >= aggregate.getCount() ? true : false ;
    24 }
    25
    26 @Override //得到下一对象
    27 public Object next() {
    28 Object obj = null ;
    29 current ++ ;
    30 if(current < aggregate.getCount()){
    31 obj = aggregate.getItem(current);
    32 }
    33 return obj;
    34 }
    35
    36 }
     1 public class ConcreteIteratorDec extends Iterator{
    2
    3 private ConcreteAggregate aggregate ;
    4 private int current = 0 ;
    5
    6 public ConcreteIteratorDec(ConcreteAggregate aggregate){
    7 this.aggregate = aggregate ;
    8 current = aggregate.getCount() -1 ;
    9 }
    10
    11 @Override
    12 public Object getCurrentItem() {
    13 return aggregate.getItem(current);
    14 }
    15
    16 @Override
    17 public Object getFirst() {
    18 return aggregate.getItem(aggregate.getCount() -1);
    19 }
    20
    21 @Override
    22 public boolean isDone() {
    23 return current < 0 ? true : false ;
    24 }
    25
    26 @Override
    27 public Object next() {
    28 Object obj = null ;
    29 current -- ;
    30 if(current >= 0){
    31 obj = aggregate.getItem(current);
    32 }
    33 return obj;
    34 }
    35
    36 }
     1     public static void main(String[] args) {
    2
    3 ConcreteAggregate agg = new ConcreteAggregate();
    4
    5 agg.setItem("abc");
    6 agg.setItem("小花");
    7 agg.setItem("阿猫");
    8 agg.setItem("阿狗");
    9 agg.setItem("小草");
    10 agg.setItem("菊花");
    11 agg.setItem("efg");
    12
    13 //从头到尾遍历
    14 //Iterator iterator = new ConcreteIterator(agg);
    15 //从尾到头遍历
    16 Iterator iterator = agg.createIterator();
    17
    18 Object obj1 = iterator.getFirst();
    19
    20 while(!iterator.isDone()){
    21 System.out.println(iterator.getCurrentItem());
    22 iterator.next();
    23 }
    24
    25 }
  • 相关阅读:
    Use Gravatar in ASP.NET
    Silverlight ToolkitPivotViewer
    The Future of Silverlight December 2, 2010 at 9:00
    WPF杂记…
    Windows Phone 7开发者站点
    安装 Internet Explorer 9 Beta 的先决条件
    Internet Explorer 9 Beta(多图)
    Expression Blend4 中文
    Silverlight and WPF Virtual books
    Server2008 安装 Zune
  • 原文地址:https://www.cnblogs.com/xuekyo/p/2400412.html
Copyright © 2020-2023  润新知