当前位置: 首页 > Thinking in Java > 正文

第10章–内部类_基础,内部类 的 外围类 _迭代器模式

当生成一个内部类对象时,这个内部类对象就与制造它的

外围类对象(enclosing object)之间就有了一种关系.

所以它能访问外围类对象的所有成员,而不需要任何特殊条件.

所以,内部类对象 拥有 外围类的所有元素的访问权(包含private的).

/**
 * 
 * 内部类实现迭代器
 * 内部类可以访问 外围类的任意属性字段,包括private的
 * 迭代器接口,正向迭代器从第一个元素开始迭代 方法 end() 判断迭代是否完成,
 * current() 返回当前对象,next()移动迭代指针
 * 反向迭代器从最后一个元素开始迭代,end()和current()和正向迭代器一样,
 * previous()方法,表示将迭代指针向前移动一个
 */

interface Selector
{
  boolean end();

  Object current();

  void next();
}

//反向迭代器接口
interface IReverseSelector
{
  boolean end();
  Object current();
  void previous();
}

public class Sequence
{
  private Object[] items;   // 外围类 的 private 域
  private int      next = 0;

  public Sequence(int size)
  {
    items = new Object[size];
  }

  public void add(Object x)
  {
    if (next < items.length) items[next++] = x;
  }

  private class SequenceSelector implements Selector
  {
    private int i = 0;

    public boolean end()
    {
      return i == items.length;
    }

    public Object current()
    {
      return items[i]; // 内部类使用外围类的private域,优雅的方式
    }

    public void next()
    {
      if (i < items.length) i++;
    }
  }
  
  //实现一个 反向 迭代 的迭代器
  private class ReverseSelector implements IReverseSelector
  {
    private int i = items.length - 1; //最后一个元素的下标
    
    @Override
    public Object current()
    {
      return items[i];
    }

    @Override
    public boolean end()
    {
      return i < 0; //当i<0,表示遍历完成
    }

    @Override
    public void previous()
    {
      if(i>=0) 
      {
        i --;
      }
      
    }
  }

  public Selector selector()
  {
    return new SequenceSelector();
  }
  
  //获取反向迭代器
  public IReverseSelector getReserveSelector()
  {
    return new ReverseSelector();
  }

  public static void main(String[] args)
  {
    Sequence sequence = new Sequence(10);
    for (int i = 0; i < 10; i++)
    {
      sequence.add(Integer.toString(i));
    }
    
    //正向迭代
    Selector selector = sequence.selector();
    while (!selector.end())
    {
      System.out.print(selector.current() + " ");
      selector.next();//改变迭代指针,防止死循环出现
    }
    
    System.out.println("\n---------------------");
    
    //反向迭代
    IReverseSelector reverseSelector = sequence.getReserveSelector();
    while(!reverseSelector.end())
    {
      System.out.print(reverseSelector.current() + " ");
      reverseSelector.previous(); //改变迭代指针,防止死循环出现
    }
  }
} 

 

赞 赏

   微信赞赏  支付宝赞赏


本文固定链接: https://www.jack-yin.com/coding/thinking-in-java/2387.html | 边城网事

该日志由 边城网事 于2013年07月10日发表在 Thinking in Java 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: 第10章–内部类_基础,内部类 的 外围类 _迭代器模式 | 边城网事
关键字: ,

第10章–内部类_基础,内部类 的 外围类 _迭代器模式 暂无评论

发表评论

快捷键:Ctrl+Enter