java设计模式:迭代器设计模式

package com.selfStudy;
import java.util.*;


/*
 *  [结合java:四器 之 迭代器](http://blog.csdn.net/managementandjava/article/details/51404884)
 * 
 * 通过以下两个例子来展现iterator的用法;
 *      首先理解下为什么存在迭代器;
 *      迭代器就是集合取出元素的方式;
 *      因为每个容器都有 存和取的功能,由于每个容器的数据存储结构不同,其存和取的方式也就不同;而对于取出元素,其不止一个动作来完成(先判断 再取等多个动作)
 *      那么这多个动作就应该封装成一个对象;这样每个容器中就都有一个取出数据的对象;因为不同容器的数据结构不同,因此每个容器中取出对象的实现方式也不一样;
 *      那么就应该在每个容器内部 定义一个取出元素的内部类(因为数据就存在这个容器中,直接用内部类来操作这些数据时最方方便的,因此用内部类),但是这些取出
 *      的内部类有自己的共性东西 都有 判断和取出。因此就可以向上抽取成一个接口(Iterator)
 * 
 *      对内部类的理解和迭代器设计模式的理解:
 *          内部类: 容器是一个事物,而容器内部存储的东西也是一个事物,那么就可以定一个内部类在容器内操容器内的事物;
 *          迭代器设计模式:多个类都有自己操作其内部数据的方式,而这些方式又有相同的共性,那么就可以把这个共性抽取成一个接口,在各个类中提供一个方法
 *                     来返回这个接口,通过这个接口(进而通过内部类)来操作这多个类中的数据;
 * 
 *  迭代器设计模式:
 *      又称游标设计模式:GOF给出的定义:提供一种方法访问一个容器对象中的各个元素,而又不暴露该对象的内部细节
 *  组成元素:
 *  1.抽象迭代器:定义遍历元素所需要的方法,一般来说会有这么三个方法:next(),hasNext()和remove(),
 *  2.迭代器实现:实现迭代器接口中定义的方法,完成集合的迭代。
 *  3.抽象容器:一般是一个接口,提供一个iterator()方法,例如java中的Collection接口,List接口,Set接口等。
 *  4.具体容器:就是抽象容器的具体实现类,比如List接口的有序列表实现ArrayList.
 * 
 * 使用场景:
 *  迭代器模式是与集合共生共死的,一般来说,我们只要实现一个集合,就需要同时提供这个集合的迭代器,就像java中的
 *  Collection,List、Set、Map等,这些集合都 *  有自己的迭代器。假如我们要实现一个这样的新的容器,当然也需要引
 *  入迭代器模式,给我们的容器实现一个迭代器。
 * */

//实例1:
//1.抽象迭代器
interface MyIterator{
    public Object next();
    public boolean hasNext();
}

//2.迭代器实现
class MyListIterator implements MyIterator{
    private List<?> list = null;
    public MyListIterator(List<?> list){
        this.list = list;
    }

    private int count = 0;
    public Object next(){
        Object obj=null;
        if(this.hasNext()){
            obj =  list.get(count++);
        }
        return obj; 
    }

    public boolean hasNext(){
        if(count==list.size())
            return false;
        else
            return true;
    }
}

//抽象容器
interface MyCollection{
    public void addAll(Object[] objs);
    public MyIterator iterator();
}

//具体容器
class MyListCollection implements MyCollection{
    private List<Object> list= new ArrayList<Object>();

    public void addAll(Object[] objs) {
        for(Object obj:objs)
            list.add(obj);
    }
    @Override
    public MyIterator iterator() {
        return new MyListIterator(list);
    }

}


public class IteratorModel {

    public static void main(String[] args) {
        String[] infos = "hello java : wo should say hello to the world !!".split(" ");

        MyListCollection mc = new MyListCollection();
        mc.addAll(infos);
        for(MyIterator mi = mc.iterator();mi.hasNext();){
            System.out.print(mi.next()+" ");
        }
    }
}











输出结果:
hello java : wo should say hello to the world !!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值