java+适配器模式 实现自己的迭代器...

简介: package me; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.

package me;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
/**
 * @author xiaowei
 * @param <T>
 * 我们有时候希望迭代器迭代的不仅仅是正向 而且也希望在迭代器中增加一些新的方法...那么就是用适配器模式 
 * 因为我们知道默认for 之所以能迭代 集合原因是集合实现了Iterable接口 并且实现了 iterator方法 ..
 * 因为我们想要多种功能所以我们不可以覆盖 iterator方法 .. 因为一旦覆盖那么..原来的功能就没有..
 * 这时候我们就可以通过返回一个实现了Iterable接口的内部类...因为我们知道内部类可以操作外围类
 * 并且有一切权限.  进而为我们适配提供了基础
 * .因为我们迭代的就是实现Iterable的集合 ..而我们返回的内部类 也是实现了Iterable的类..但是我们
 * 也完全可以操作外围类..所以完全可以实现我们自己的迭代功能。。 
 * 在使用Arrays.asList(T...e)的时候注意 ..这个工具方法返回的是实际封装底层数据的一个列表..我们队返回列表的操作也会反映到原始数组上 。。。
 * 我想是在List内部维护    private transient Object[] elementData;如此声明的数组引用..直接引用了 我们的数组对象./
 * 要记住的一点在java中除了基本数据类型 一切皆是对象。。。所以可以维护到程序结束。。
 * Collecion.toArray()转换成数组的时候 返回的是容器内部数据的一个副本数组
 *
 */
public class MyIterator<T> extends ArrayList<T> { 
 private static final long serialVersionUID = 1L;
  @Override
     public Iterator<T>  iterator() {   //正向
      // TODO Auto-generated method stub
      return super.iterator();
     }
  
  public Iterable<T>  shuffledIterator(){  //乱序
   return new Iterable<T>() {

    @Override
    public Iterator<T> iterator() {  //toArray之所以是安全的因为它会分配一个新的副本
     Collections.shuffle(Arrays.asList(MyIterator.this.toArray())) ;  //所以这里的操作不会影响到实际容易中的元素 。。。这里不对
     return  MyIterator.this.iterator() ;
    }
   };
   
  }
  public Iterable<T>  reserveIterator()    //反响迭代器
    {
    return new Iterable<T>  (){
     @Override
     public Iterator<T>  iterator() {
      // TODO Auto-generated method stub
      return new Iterator<T> (){
       int cur=size()-1;
       @Override
       public boolean hasNext() {
        return cur>=0 ;
       }
       @Override
       public T next() {
        return get(cur--);
       }
       @Override
       public void remove() {
        throw new UnsupportedOperationException() ;
       }
      };  
     }
    };
      }
     public static void main(String[]agrs){
      MyIterator<String> my=new MyIterator<String>(){
    private static final long serialVersionUID = 1L;
    {
        add("zhangsan") ;
        add("lise")  ;
        add("wangwu") ;
        add("maliu") ;
        add("xiaoxue") ;
       }
      } ; 
      for(Object obj:my.reserveIterator()){
       System.out.print(obj+" ");
      } 
      System.out.println("\n");
      for(Object obj:my.shuffledIterator()){
       System.out.print(obj+" ");
      } 
      
      //下面说明了  Arrays.asList()实际是按照底层数据返回列表的..所以我们在打乱了列表的顺序的同时 也就打乱了底层的数据...下面代码可以看到
      String[] str ={"one","two","three","four","five","six","seven"} ;  
      List<String> li=Arrays.asList(str) ;
      Collections.shuffle(li); 
      System.out.println(Arrays.toString(str));
      
      
      
      
     }
}

目录
相关文章
|
20天前
|
设计模式 Java 中间件
23种设计模式,适配器模式的概念优缺点以及JAVA代码举例
【4月更文挑战第6天】适配器模式(Adapter Pattern)是一种结构型设计模式,它的主要目标是让原本由于接口不匹配而不能一起工作的类可以一起工作。适配器模式主要有两种形式:类适配器和对象适配器。类适配器模式通过继承来实现适配,而对象适配器模式则通过组合来实现
30 4
|
1月前
Servlet使用适配器模式进行增删改查案例(IDeptService.java)
Servlet使用适配器模式进行增删改查案例(IDeptService.java)
14 0
|
1月前
Servlet使用适配器模式进行增删改查案例(EmpDaoImpl.java)
Servlet使用适配器模式进行增删改查案例(EmpDaoImpl.java)
13 0
|
1月前
Servlet使用适配器模式进行增删改查案例(DeptDaoImpl.java)
Servlet使用适配器模式进行增删改查案例(DeptDaoImpl.java)
12 0
|
1月前
Servlet使用适配器模式进行增删改查案例(IDeptDao.java和IEmpDao.java)
Servlet使用适配器模式进行增删改查案例(IDeptDao.java和IEmpDao.java)
14 0
|
1月前
Servlet使用适配器模式进行增删改查案例(IBaseDaoUtil.java)
Servlet使用适配器模式进行增删改查案例(IBaseDaoUtil.java)
19 0
|
1月前
Servlet使用适配器模式进行增删改查案例(BaseDao.java)
Servlet使用适配器模式进行增删改查案例(BaseDao.java)
15 0
|
1月前
Servlet使用适配器模式进行增删改查案例(Dept.java)
Servlet使用适配器模式进行增删改查案例(Dept.java)
19 0
|
1月前
Servlet使用适配器模式进行增删改查案例(Emp.java)
Servlet使用适配器模式进行增删改查案例(Emp.java)
11 0
|
4月前
|
设计模式 Java
Java设计模式【六】:适配器模式
Java设计模式【六】:适配器模式
15 0