首页 > 编程语言 >20.(行为型模式)java设计模式之迭代器模式

20.(行为型模式)java设计模式之迭代器模式

时间:2023-03-22 23:55:48浏览次数:54  
标签:obj iterator 迭代 Object list 模式 20 设计模式 public

一、什么是迭代器模式(IteratorPattern)

     提供—种方法顺序访问一个聚合对象中各个元素,而又无须暴露该对象的内部实现,属于行为型模式。

应用场景:
      —般来说,迭代器模式是与集合是共存的,只要实现一个集合,就需要同时提供这个集合的迭代器,就像java中的Collection,List、Set、Map等都有自己的迭代器。JAVA中的iterator迭代器。

二、迭代器的实现方式

模式结构分析:

  • 抽象容器(Aggregate)︰提供创建具体迭代器角色的接口,一般是接口,包括一个iterator()方法,例如java中的Collection接口,List接口,Set接口等。
  • 具体容器角色(ConcreteAggregate):实现抽象容器的具体实现类,比如List接口的有序列表实现ArrayList,List接口的链表实现LinkedList, Set接口的哈希列表的实现HashSet等。
  • 抽象迭代器角色(lterator)︰负责定义访问和遍历元素的接口,包括几个核心方法,取得下一个元素的方法next(),判断是否遍历结束的方法isDone()(或者叫hasNext()),移除当前对象的方法remove()
  • 具体迭代器角色(Concretelterator)︰实现迭代器接口中定义的方法,并要记录遍历中的当前位置,完成集合的迭代

类关系图:

统一模型:

代码实现:

查看代码
/*
* 抽象迭代器
* */
public interface Iterator {
    /**
     * 获取下个元素
     * @return
     */
    Object next();
    /**
     * 是否有下⼀个
     * @return
     */
    boolean hasNext();
    /**
     * 删除元素
     * @param obj
     * @return
     */
    Object remove(Object obj);
}
/*
*具体的迭代器
*
* */
public class ConcreteIterator implements Iterator {
    private List list;
    private int index = 0;

    public ConcreteIterator(List list) {
        this.list = list;
    }

    @Override
    public Object next() {
        Object obj = null;
        if (this.hasNext()) {
            obj = this.list.get(index);
            index++;
        }
        return obj;
    }

    @Override
    public boolean hasNext() {
        if (index == list.size()) {
            return false;
        }
        return true;
    }

    @Override
    public Object remove(Object obj) {
        return list.remove(obj);
    }
}
public interface ICollection {
    void add(Object obj);
    void remove(Object obj);
    Iterator iterator();
}
/*
* 容器简化版
* */
public class MyCollection implements ICollection{
    private List list = new ArrayList();
    @Override
    public void add(Object obj) {
        list.add(obj);
    }
    @Override
    public void remove(Object obj) {
        list.remove(obj);
    }
    @Override
    public Iterator iterator() {
        return new ConcreteIterator(list);
    }
}

测试用例:

@Test
public void getIterator(){
    ICollection collection = new MyCollection();
    collection.add("test1");
    collection.add("test2");
    collection.add("test3");
    collection.add("test4");
    collection.add("test5");
    Iterator iterator = collection.iterator();
    while (iterator.hasNext()){
        Object obj = iterator.next();
        System.out.println(obj);
    }
}

测试结果:

test1
test2
test3
test4
test5

方法评估:

优点:

  • 可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据
  • 支持以不同的方式遍历一个聚合对象

缺点:

  • 对于比较简单的遍历(像数组或者有序列表),使用迭代器方式遍历较为繁琐
  • 迭代器模式在遍历的同时更改迭代器所在的集合结构会导致出现异常

三、JAVA知识点

四.汇总

标签:obj,iterator,迭代,Object,list,模式,20,设计模式,public
From: https://www.cnblogs.com/q994321263/p/17053581.html

相关文章

  • C++图书订单管理系统[2023-03-22]
    C++图书订单管理系统[2023-03-22]采用面向对象程序设计方法设计并实现图书订单管理系统订单基本信息:顾客帐号、顾客姓名、订书日期、图书书号、书名、购买数量订单基本......
  • 2023年3月22号
    今天学习了JDBC的DriverManager(驱动管理对象)、Connection(数据库连接对象)、Statement(执行sql语句的对象)、ResultSet(结果集对象)。还有第一个程序MyBatis,1.创建Maven项目,2.搭......
  • 2023.3.22三天学习总结
    一.三天任务1.费用流的学习和练习2.dp练习3.cf补题和abc补题4.补了一些以前题目的题解二.补题情况   三.题解(174条消息)图论习......
  • 每日总结2023/3/22
    今天进行了Android的第三步的的线路查询输出,并进行了最短路径的线路查询算法学习。  进行了网站搜索地图的api设置。进行了学习。对算法的进行明天进行分析。......
  • SpringMVC-lesson04-hellospringmvc-注解开发-2023-03-22
    真实开发-注解开发1、<?xmlversion="1.0"encoding="UTF-8"?><web-appxmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XM......
  • 20201306——Exp2 后门原理与实践
    一、实验准备1、实验要求使用netcat获取主机操作Shell,cron启动使用socat获取主机操作Shell,任务计划启动使用MSFmeterpreter(或其他软件)生成可执行文件,利用ncat或soca......
  • 2023.3.22
     结对作业前两个功能做出最后的更新与调试,对最短路径问题的讨论和解决,并且进行了代码的完善,对辅助功能的完善。......
  • 2023.3.22每日总结
    importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.sql.Statement;publicclassT......
  • 2023年3月22日软工日报
    今天下午写了会儿api,下午我们宿舍团建,晚上继续写那个安卓和自己的web选修作业。  cp之照: ......
  • 2023-03-23_并查集
    并查集两个点之间在树或图中是否连通的问题。1什么是并查集?连接问题网络中节点间的连接状态数学中的集合类实现连接问题与路径问题:解决路径问题便一定可以解......