美文网首页
16、ITEPTER(迭代器模式)

16、ITEPTER(迭代器模式)

作者: 我要扭开奥利奥 | 来源:发表于2019-05-28 21:24 被阅读0次

目的

提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部展示。

使用场景

  • 访问一个聚合对象又不暴露他的外部显示
  • 支持对聚合对象的多种遍历
  • 为遍历不同的对象提供一个统一的接口,即支持多态迭代

使用场景

对于迭代器模式,我们最熟悉的就是Java的各种List的迭代器了。通过迭代器我们可以对于列表进行遍历,但是又不需要访问其内部元素也就是不需要进行下标访问。
对于该模式我很感兴趣,对其进行实现如下:

首先我们需要实现容器,也就是我们迭代的对象

/**
 * 容器接口,定义了基本操作
 */
public interface MyList {
    void add(Object o);
    Object get(int index);
    Iterator iterator();
    int getSize();
}


/**
 * 容器具体实现类,通过该类具体实现list的基本功能
 */
public class ConcreteList implements MyList{
    private Object[] list;
    private int size = 0;   //代表最多能够存放多少数据
    private int index = 0;  //代表已经存放了多少数据
    public ConcreteList(){
        index = 0;
        size = 8;
        list = new Object[size];
    }

    @Override
    public void add(Object o){
        if(index < size){
            list[index++] = o;
        }else{
            //数组长度不够,扩容
            Object[] tmp = new Object[size<<1];
            for(int i = 0;i < index;i++){
                tmp[i] = list[i];
            }
            tmp[index++] = o;
            list = tmp;
        }
    }
    @Override
    public Iterator iterator(){
        return new ConcreteIterator(this);
    }
    @Override
    public Object get(int index){
        if(index  < size){  //判断区间是否正常
            return list[index];
        }else{
            return null;
        }
    }
    @Override
    public int getSize(){
        return index;
    }
}

现在我们需要实现的就是迭代器了,为了提高迭代器的扩展型性和适用性,我们把迭代器操作的的对象设置为Object类

/**
 * 为了简单起见,只实现两个最简单的功能
 * 为了支持多态性,next的返回值为Object
 */
public interface Iterator {
    boolean hasNext();
    Object next();
}

/**
 * 迭代器接口的具体实现类,在这个类里面实现接口定义的功能
 */
public class ConcreteIterator implements Iterator{
    private MyList list = null;
    private int index;
    public ConcreteIterator(MyList list){
        super();
        this.list = list;
    }
    @Override
    public boolean hasNext(){
        return index < list.getSize();
    }
    @Override
    public Object next(){
        if(index < list.getSize())
            return list.get(index++);
        else
            return null;
    }
}

最后是测试文件

public class Client {
    public static void main(String[] args) {
        MyList list = new ConcreteList();
        //由于Java对于基本类型会进行自动装箱
        //因此可以直接添加基本类型数据
        list.add(10);
        list.add(20);
        list.add(30);
        list.add(1.23f);
        list.add(3.45d);
        Iterator iterator = new ConcreteIterator(list);
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}

输出结果如下:

10
20
30
1.23
3.45

相关文章

  • 16、ITEPTER(迭代器模式)

    目的 提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部展示。 使用场景 访问一个聚合对象又不暴露...

  • 设计模式(17) 迭代器模式

    迭代器模式 基于IEnumerable的实现 使用场景 迭代器模式的优缺点 迭代器模式 迭代器模式用于顺序访问集合...

  • 第5章 -行为型模式-迭代器模式

    一、迭代器模式的简介 二、迭代器模式的优缺点 三、迭代器模式的实例

  • 行为型模式:迭代器模式

    LieBrother原文:行为型模式:迭代器模式 十一大行为型模式之六:迭代器模式。 简介 姓名 :迭代器模式 英...

  • Iterator模式

    迭代器模式(Iterator模式) 定义: 迭代器(Iterator)模式,又叫做游标(Cursor)模式。 ...

  • 迭代器模式

    一、迭代器模式介绍 二、迭代器模式代码实例

  • 设计模式 | 迭代器模式及典型应用

    本文的主要内容: 介绍迭代器模式 源码分析迭代器模式的典型应用Java集合中的迭代器模式Mybatis中的迭代器模...

  • 设计模式系列——迭代器模式

    迭代器模式介绍 迭代器模式是行为模式之一,又称为(Cursor)模式。迭代器模式源于对容器的访问,如List,Ma...

  • php设计模式——迭代器模式

    迭代器模式 说明 迭代器模式是遍历集合的成熟模式,迭代器模式的关键是将遍历集合的任务交给一个叫做迭代器的对象,它的...

  • JavaScript设计模式五(迭代器模式)

    JavaScript设计模式五(迭代器模式) 迭代器模式的定义: 迭代器模式的意思就是提供一种方法能够顺序的访问聚...

网友评论

      本文标题:16、ITEPTER(迭代器模式)

      本文链接:https://www.haomeiwen.com/subject/dlwjtctx.html