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

标签: java 配器 模式 | 发表时间:2012-06-23 20:49 | 作者:yue7603835
出处:http://blog.csdn.net

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));
      
      
      
      
     }
}

作者:yue7603835 发表于2012-6-23 20:49:09 原文链接
阅读:0 评论:0 查看评论

相关 [java 配器 模式] 推荐:

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

- - CSDN博客推荐文章
 * 我们有时候希望迭代器迭代的不仅仅是正向 而且也希望在迭代器中增加一些新的方法...那么就是用适配器模式 .  * 因为我们知道默认for 之所以能迭代 集合原因是集合实现了Iterable接口 并且实现了 iterator方法.  * 因为我们想要多种功能所以我们不可以覆盖 iterator方法.

Java观察者模式

- - CSDN博客架构设计推荐文章
闲话少说,贴出code供参考:. /** * @author Verphen * @date 2013年10月4日 下午11:02:21 */ package org.verphen.observer; /*抽象被观察者角色*/ public interface IWitched {. /* 被观察者 发生变化,通知观察者 */.

Java回调与模板方法模式

- - ITeye博客
一.Java回调与模板方法模式 . 模板方法模式很常用,其目的是在一个方法中定义一个算法骨架,而将一些步骤延迟到子类中. 模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤. 在标准的模板方法模式实现中,主要是使用继承的方式,来让父类在运行期间可以调用到子类的方法. 其实在Java开发中,还有另外一个方法可以实现同样的功能,那就是Java回调技术,通过回调在接口中定义的方法,调用到具体的实现类中的 方法,其本质是利用Java的动态绑定技术,在这种实现中,可以不把实现类写成单独的类,而使用内部类或匿名内部类来实现回调方法.

ZeroMQ(java)入门之Requerst/Response模式

- - CSDN博客架构设计推荐文章
自己最开始是在cloud foundry中接触过消息服务器(nats),或者说是消息中间件,也算是初步知道了一个消息服务器对于分布式的网络系统的重要性,后来自己也曾想过在一些项目中使用它,尤其是在一些分布式的环境下,可以极大的方便整个系统的实现. 在中间通过一个消息中间件,可以很方便的将各个woker的数据发送到最终的统计服务器来做数据的统计,从而减少很多在网络通信中会消耗的编程时间.

Java中的观察者模式

- - CSDN博客编程语言推荐文章
这个接口定义了一个update()方法,当被观察者对象的状态发生变化时,这个方法就会被调用. 这个方法的实现类应当调用每一个被观察者对象的notifyObservers()方法,从而通知所有的观察对象. 被观察者类都是java.util.Observable类的子类. 这个类主要提供下面几个方法:.

[转]java 混合模式 ,解释模式 (java.vm.info=mixed mode, sharing)

- - 小鸥的博客
 设置zip/jar资源或者类(.class文件)存放目录路径.  追加zip/jar资源或者类(.class文件)存放目录路径.  预先加载zip/jar资源或者类(.class文件)存放目录路径.  设置JVM初始化堆内存大小.  设置JVM最大的堆内存大小.  执行严格的代码检查,预测可能出现的情况.

多核系统上的 Java 并发缺陷模式(bug patterns)

- yat - IBM developerWorks 中国 : 文档库
通过研究并发(bug patterns)缺陷模式,您既能够提高对并发编程的理解,还能够了解如何发现无效或可能无效的编程方法. 在本文中,作者 Zhi Da Luo、Yarden Nir-Buchbinder 和. Raja Das 阐述了 6 个鲜为人知的、可能威胁运行在多核系统上的 Java 应用程序的线程安全和性能的并发缺陷.

Java开发中的23种设计模式详解

- - 企业架构 - ITeye博客
设计模式(Design Patterns).                                   ——可复用面向对象软件的基础. 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结. 使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性.

《Java事务设计策略》服务器端代理拥有事务的设计模式

- - 酷勤网-挖经验 [expanded by feedex.net]
当您在应用架构中用到命令模式(Command Pattern)或服务器端代理设计模式(Server Delegate Design pattern)时,本章描述的事务设计模式就比较适合了. 在本模式中,服务器端代理组件,作为对服务器的远程接入点,拥有事务并负责对事务实施全面的管理. 其他任何组件,包括客户端组件、领域服务组件、或是持久化组件都不负责管理事务,它们甚至不会察觉到它们正在使用到了事务.

Java中的锁(Locks in Java)

- - 并发编程网 - ifeve.com
原文链接 作者:Jakob Jenkov 译者:申章 校对:丁一. 锁像synchronized同步块一样,是一种线程同步机制,但比Java中的synchronized同步块更复杂. 因为锁(以及其它更高级的线程同步机制)是由synchronized同步块的方式实现的,所以我们还不能完全摆脱synchronized关键字( 译者注:这说的是Java 5之前的情况).