博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式(20)-----迭代器模式
阅读量:5071 次
发布时间:2019-06-12

本文共 3157 字,大约阅读时间需要 10 分钟。

迭代器模式(Iterator)

定义

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

UML类图

角色

  迭代器角色(Iterator): 负责定义访问和遍历元素的接口。

  具体迭代器角色(Concrete Iterator):实现迭代器接口,并要记录遍历中的当前位置。
  容器角色(Aggregate):  负责提供创建具体迭代器角色的接口。
  具体容器角色(Concrete Aggregate):实现创建具体迭代器角色的接口, 这个具体迭代器角色与该容器的结构相关。

例子

  Iterator

package com.csdhsm.pattemdesign.iterator;/**   * @Title:  Iterator.java    * @Description: 迭代抽象类  * @author: Han    * @date:   2016年6月26日 下午3:12:33   */  public interface Iterator {        //判断是否还有下一个    public boolean hasNext();        //拿出当前元素,并游标向下移动一个    public Object next();}

  ConcreteIterator

package com.csdhsm.pattemdesign.iterator;import java.util.List;/**   * @Title:  ConcreteIterator.java    * @Description: 具体迭代实现 * @author: Han    * @date:   2016年6月26日 下午3:07:14   */  public class ConcreteIterator implements Iterator {    private List list;    //当前游标,初始为0    private int cursor = 0;        public ConcreteIterator(List list) {        this.list = list;    }    @Override    public boolean hasNext() {        return !(cursor == list.size());    }    @Override    public Object next() {        Object object = null;                if(hasNext()) {            //得到当前游标对应元素,并且游标加1            object = list.get(cursor++);        }                return object;    }}

  Aggregate

package com.csdhsm.pattemdesign.iterator;/**   * @Title:  Aggregate.java    * @Description: 聚集抽象类 * @author: Han    * @date:   2016年6月26日 下午3:13:05   */  public interface Aggregate {        //增加元素    public void add(Object obj);        //删除元素    public void remove(Object obj);        //得到迭代器    public Iterator iterator();}

  ConcreteAggregate

package com.csdhsm.pattemdesign.iterator;import java.util.List;/**   * @Title:  ConcreteAggregate.java    * @Description: 具体聚集类 * @author: Han    * @date:   2016年6月26日 下午3:13:22   */  public class ConcreteAggregate implements Aggregate {    private List list;        public ConcreteAggregate(List list) {        this.list = list;    }    @Override    public void add(Object obj) {        this.list.add(obj);    }    @Override    public void remove(Object obj) {        this.list.remove(obj);    }    @Override    public Iterator iterator() {        return new ConcreteIterator(this.list);    }}

  客户端

package com.csdhsm.pattemdesign.iterator;import java.util.ArrayList;import java.util.List;public class Solution {        public static void main(String[] args) {                List list = new ArrayList<>();        Aggregate aggregate = new ConcreteAggregate(list);                aggregate.add("张三");        aggregate.add("李四");        aggregate.add("王二");        aggregate.add("麻子");                Iterator iterator = aggregate.iterator();        while(iterator.hasNext()) {            System.out.println(iterator.next());        }    }}

  结果

总结

  

  迭代器模式的优点有:

  • 简化了遍历方式,对于对象集合的遍历,还是比较麻烦的,对于数组或者有序列表,我们尚可以通过游标来取得,但用户需要在对集合了解很清楚的前提下,自行遍历对象,但是对于hash表来说,用户遍历起来就比较麻烦了。而引入了迭代器方法后,用户用起来就简单的多了。
  • 可以提供多种遍历方式,比如说对有序列表,我们可以根据需要提供正序遍历,倒序遍历两种迭代器,用户用起来只需要得到我们实现好的迭代器,就可以方便的对集合进行遍历了。
  • 封装性良好,用户只需要得到迭代器就可以遍历,而对于遍历算法则不用去关心。

        迭代器模式的缺点

  • 对于比较简单的遍历(像数组或者有序列表),使用迭代器方式遍历较为繁琐,大家可能都有感觉,像ArrayList,我们宁可愿意使用for循环和get方法来遍历集合。

转载于:https://www.cnblogs.com/a294098789/p/5617939.html

你可能感兴趣的文章
Python爬虫
查看>>
LDA
查看>>
轻量级Mysql Sharding中间件——Shark
查看>>
python的列表与shell的数组
查看>>
移动国家号(MCC)
查看>>
关于TFS2010使用常见问题
查看>>
软件工程团队作业3
查看>>
python标准库——queue模块 的queue类(单向队列)
查看>>
display的值有哪些?
查看>>
火狐、谷歌、IE关于document.body.scrollTop和document.documentElement.scrollTop 以及值为0的问题...
查看>>
基于Lucene3.5.0怎样从TokenStream获得Token
查看>>
一网打尽各类Java基本数据类型转换
查看>>
FlowLayout布局
查看>>
深入理解JVM读书笔记--字节码执行引擎
查看>>
vue-搜索功能-实时监听搜索框的输入,N毫秒请求一次数据
查看>>
批处理 windows 服务的安装与卸载
查看>>
React文档翻译 (快速入门)
查看>>
nodejs fs路径
查看>>
动态规划算法之最大子段和
查看>>
linux c:关联变量的双for循环
查看>>