精华内容
下载资源
问答
  • 主要介绍了java 迭代器模式实例详解的相关资料,需要的朋友可以参考下
  • 本文实例讲述了PHP设计模式之迭代器模式Iterator。分享给大家供大家参考,具体如下: 1.概述 类中的面向对象编程封装应用逻辑。类,就是实例化的对象,每个单独的对象都有一个特定的身份和状态。单独的对象是一种...
  • 迭代器模式简单一句话:迭代器模式就是让用户通过接口访问容器内数据,而不需要了解容器内部数据结构,通用性强,需要与容器进行耦合。
  • 迭代器模式(Iterrator):提供一个方法顺序访问一个聚合对象中的各个元素,而又不暴露该元素的内部表示。 当你访问一个聚合对象,而且不管这些对象是什么都需要遍历的时候,你就应该考虑用迭代器模式。 你需要对聚集...
  • 设计模式--迭代器模式java例子
  • 主要介绍了Python设计模式之迭代器模式原理与用法,结合具体实例形式分析了迭代器模式的概念、原理、定义及使用方法,代码注释说明简单易懂,需要的朋友可以参考下
  • 本篇文章是对PHP设计模式中的迭代器模式进行了详细的分析介绍,需要的朋友参考下
  • 迭代器模式

    千次阅读 2019-09-25 20:24:56
    迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。 迭代器模式属于行为型模式。 介绍 意图:提供一种方法顺序...

    迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式。这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。

    迭代器模式属于行为型模式。

    介绍

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

    主要解决:不同的方式来遍历整个整合对象。

    何时使用:遍历一个聚合对象。

    如何解决:把在元素之间游走的责任交给迭代器,而不是聚合对象。

    关键代码:定义接口:hasNext, next。

    **应用实例:**JAVA 中的 iterator。

    优点 :1、它支持以不同的方式遍历一个聚合对象。 2、迭代器简化了聚合类。 3、在同一个聚合上可以有多个遍历。 4、在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。

    缺点:由于迭代器模式将存储数据和遍历数据的职责分离,增加新的聚合类需要对应增加新的迭代器类,类的个数成对增加,这在一定程度上增加了系统的复杂性。

    使用场景 :1、访问一个聚合对象的内容而无须暴露它的内部表示。 2、需要为聚合对象提供多种遍历方式。 3、为遍历不同的聚合结构提供一个统一的接口。

    注意事项:迭代器模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明地访问集合内部的数据。

    实现

    我们将创建一个叙述导航方法的 Iterator 接口和一个返回迭代器的 Container 接口。实现了 Container 接口的实体类将负责实现 Iterator 接口。

    IteratorPatternDemo,我们的演示类使用实体类 NamesRepository 来打印 NamesRepository 中存储为集合的 Names

    迭代器模式

    步骤 1

    创建接口。

    Iterator.java

    public interface Iterator {
    
        boolean hasNext();
        Object next();
    
    }
    

    Container.java

    public interface Container {
    
        Iterator getIterator();
    
    }
    

    步骤 2

    创建实现了 Container 接口的实体类。该类有实现了 Iterator 接口的内部类 NameIterator

    NameRepository.java

    public class NameRepository implements Container {
    
        public String names[] = {"Robert", "John", "Julie", "Lora"};
    
        @Override
        public Iterator getIterator() {
            return new NameIterator();
        }
    
        private class NameIterator implements Iterator {
    
            int index;
    
            @Override
            public boolean hasNext() {
                if (index < names.length) {
                    return true;
                }
                return false;
            }
    
            @Override
            public Object next() {
                if (this.hasNext()) {
                    return names[index++];
                }
                return null;
            }
        }
    
    }
    

    步骤 3

    使用 NameRepository 来获取迭代器,并打印名字。

    IteratorPatternDemo.java

    public class IteratorPatternDemo {
    
        public static void main(String[] args) {
            NameRepository namesRepository = new NameRepository();
    
            for (Iterator iter = namesRepository.getIterator(); iter.hasNext(); ) {
                String name = (String) iter.next();
                System.out.println("Name : " + name);
            }
        }
    
    }
    

    步骤 4

    验证输出。

    Name : Robert
    Name : John
    Name : Julie
    Name : Lora
    
    展开全文
  • 主要介绍了MyBatis框架迭代器模式实现原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 本资源包含一个java体系结构(设计模式)的迭代器模式的例题详解,包含全部源代码。需要的朋友可以自行下载!!!!!!!!!!!!!!!!!!!!!
  • 设计模式 java 迭代器模式
  • 主要介绍了Java使用设计模式中迭代器模式构建项目的代码结构示例,迭代器模式能够对访问者隐藏对象的内部细节,需要的朋友可以参考下
  • 主要介绍了Java基于迭代器模式实现的访问人员列表操作,简单描述了迭代器模式的概念、原理以及使用迭代器模式实现访问人员列表的相关操作技巧,需要的朋友可以参考下
  • 迭代器模式 前言很早之前,我们的电视调节频道是需要用电视上的按钮去控制的,那时并没有遥控器,如果我们想要调台,只能一次又一次的拧按钮。 越来越高级的电视机相继出现,现在的电话机,我们有了电视遥控器,...

    迭代器模式

    前言
    很早之前,我们的电视调节频道是需要用电视上的按钮去控制的,那时并没有遥控器,如果我们想要调台,只能一次又一次的拧按钮。

    在这里插入图片描述
    越来越高级的电视机相继出现,现在的电话机,我们有了电视遥控器,我们使用电视遥控器来调台,这个时候,无需直接操作电视。
    在这里插入图片描述在这里插入图片描述
    我们可以将电视机看成一个存储电视频道的集合对象,通过遥控器可以对电视机中的电视频道集合进行操作,如返回上一个频道、跳转到下一个频道或者跳转至指定的频道。遥控器为我们操作电视频道带来很大的方便,用户并不需要知道这些频道到底如何存储在电视机中。

    具体案例:
    编写程序展示一个学校院系结构:需求是这样,要在一个页面中展示出学校的院系 组成, 一个学校有多个学院,一个学院有多个系
    分析:

    每一个学院都有添加系的功能,如果我们将遍历的方法hasNext() next()等写入。这将导致聚合类的职责过重,它既负责存储和管理数据,又负责遍历数据,违反了“单一职责原则”,由于聚合类非常庞大,实现代码过长,还将给测试和维护增加难度。

    那么这个时候,我们也许会这样想,因为有多个学院,我们不妨将学院封装为接口,但是在这个接口中充斥着大量方法,不利于子类实现,违反了“接口隔离原则”。

    解决方案:

    解决方案之一就是将聚合类中负责遍历数据的方法提取出来,封装到专门的类中,实现数据存储和数据遍历分离,无须暴露聚合类的内部属性即可对其进行操作,而这正是迭代器模式的意图所在。

    基本介绍
    1. 迭代器模式(Iterator Pattern)是常用的设计模式,属于行为型模式
    2. 如果我们的集合元素是用不同的方式实现的,有数组,还有java的集合类,
      或者还有其他方式,当客户端要遍历这些集合元素的时候就要使用多种遍历
      方式,而且还会暴露元素的内部结构,可以考虑使用迭代器模式解决。
    3. 迭代器模式,提供一种遍历集合元素的统一接口,用一致的方法遍历集合元素,
      不需要知道集合对象的底层表示,即:不暴露其内部的结构。
    原理类图:

    在这里插入图片描述

    角色分析:
    1. Iterator (抽象迭代器): 迭代器接口,是系统提供,含义 hasNext, next, remove
    2. ConcreteIterator (具体迭代器): 具体的迭代器类,管理迭代 在具体迭代器中通过游标来记录在聚合对象中所处的当前位置,在具体实现时,游标通常是一个表示位置的非负整数。
    3. Aggregate (抽象聚合类):一个统一的聚合接口, 将客户端和具体聚合解耦
    4. ConcreteAggreage (具体聚合类): 具体的聚合持有对象集合, 并提供一个方法,返回一个
    代码实例:

    聚合类:

    学院接口:

    /**
     * 学院
     *
     * @author 孙一鸣 on 2020/2/17
     */
    public interface College {
    
        public String getName();
        //增加系的方法
        public void addDepartment (String name,String des);
    
        //换回一个迭代器,遍历
        public Iterator createIterator();
    
    }
    

    计算机学院:

    
    /**
     * 计算机学院
     *
     * @author 孙一鸣 on 2020/2/17
     */
    public class ComputerCollege implements College
    {
        Department[] departments;
        int numOfDepartment = 0;//保存当前数组对象个数
    
        public ComputerCollege() {
            departments = new Department[5];//计算机学院有5个系
            addDepartment("Java","JAVA牛逼");
            addDepartment("Php","经典");
            addDepartment("C#","还好");
            addDepartment("Python","智能");
            addDepartment("GO","牛");
    
        }
    
        @Override
        public String getName() {
            return "计算机学院";
        }
    
        //给计算机学院添加系
        @Override
        public void addDepartment(String name,String des) {
            Department department = new Department(name,des);
            departments[numOfDepartment] = department;
            numOfDepartment += 1;
        }
    
        @Override
        public Iterator createIterator() {
            return new ComputerCollegeIterator(departments);
        }
    }
    
    

    信息学院

    
    /**
     * 信息学院
     *
     * @author 孙一鸣 on 2020/2/17
     */
    public class InfoCollege implements College
    {
        List<Department> departments;
       // int numOfDepartment = 0;//保存当前数组对象个数
    
        public InfoCollege() {
            departments = new ArrayList<Department>();
            //计算机学院有5个系
            addDepartment("信息安全","JAVA牛逼");
            addDepartment("网络安全","经典");
            addDepartment("服务器安全","还好");
            addDepartment("数据库安全","智能");
        }
    
        @Override
        public String getName() {
            return "计算机学院";
        }
    
        //给计算机学院添加系
        @Override
        public void addDepartment(String name,String des) {
            Department department = new Department(name,des);
           departments.add(department);
            //numOfDepartment += 1;
        }
    
        @Override
        public Iterator createIterator() {
            return new InfoCollegeIterator(departments);
        }
    }
    
    

    学院下面的系:

    
    /**
     * 系
     *学校 --学院 -- 系
     * @author 孙一鸣 on 2020/2/17
     */
    public class Department {
         private  String name;
         private  String des;
    
        public Department(String name, String des) {
            this.name = name;
            this.des = des;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getDes() {
            return des;
        }
    
        public void setDes(String des) {
            this.des = des;
        }
    }
    
    

    迭代器类:
    计算机学院迭代器

    
    /**
     * @author 孙一鸣 on 2020/2/17
     * ComputerCollegeIterator: 计算机学院迭代器,
     * 遍历计算机学院下的系
     */
    public class ComputerCollegeIterator implements Iterator {
    
        /*
        * 这里需要知道 Department 以怎样的方式存放
        *
        * */
    
        Department[] departments;
        int position = 0;//遍历的位置
    
        public ComputerCollegeIterator(Department[] departments) {
            this.departments = departments;
        }
    
        @Override
        public boolean hasNext() {
            if (position >= departments.length || departments[position] ==null)
            {
                return false;
            }else {
                return  true;
            }
        }
    
        @Override
        public Object next() {
            Department department =departments[position];
            position +=1;
            return department;
        }
    
        @Override
        public void remove() {
    
        }
    }
    
    

    信息学院迭代器:

    
    /**
     * @author 孙一鸣 on 2020/2/17
     * ComputerCollegeIterator: 信息学院迭代器,
     * 遍历信息学院下的系
     */
    public class InfoCollegeIterator implements Iterator {
    
        /*
        * 这里需要知道 Department 以怎样的方式存放
        *
        * */
    
        List<Department> departments;
        int position = -1;//索引
    
        public InfoCollegeIterator( List<Department> departments) {
            this.departments = departments;
        }
    
        @Override
        public boolean hasNext() {
            if (position >= departments.size()-1 )
            {
                return false;
            }else {
                position +=1;
                return  true;
            }
        }
    
        @Override
        public Object next() {
    
            return departments.get(position);
        }
    
        @Override
        public void remove() {
    
        }
    }
    
    

    输出信息类:

    
    /**
     * @author 孙一鸣 on 2020/2/17
     * 输出信息类
     */
    public class OutPutClass {
        List<College> colleges;
    
        public OutPutClass(List<College> colleges) {
            this.colleges = colleges;
        }
    
        //遍历单个学院取出系
        public void printDepartment(Iterator iterator) {
            while (iterator.hasNext()) {
                Department department = (Department) iterator.next();
                System.out.println("department.getName() = " + department.getName());
            }
        }
    
        //遍历学院集合 输出所有学院
        public void printCollege() {
            //此时遍历不用传入 迭代器
            //学院使用List集合 已经实现Iterator
            Iterator<College> iterator = colleges.iterator();
            while(iterator.hasNext()){
                //取出一个学院
                College college = iterator.next();
                System.out.println("========="+college.getName()+"====");
                printDepartment(college.createIterator());
            }
        }
    }
    
    

    测试类:

    
    /**
     * @author 孙一鸣 on 2020/2/17
     */
    public class Client {
        public static void main(String[] args) {
            List<College> colleges = new ArrayList<College>();
            College computerCollege = new ComputerCollege();
            College infocollege = new InfoCollege();
            colleges.add(computerCollege);
            colleges.add(infocollege);
    
            OutPutClass outPutClass = new OutPutClass(colleges);
            outPutClass.printCollege();
        }
    }
    
    
    结果截图:

    在这里插入图片描述

    代码分析:

    如果需要增加一个新的具体聚合类,只需增加一个新的聚合子类和一个新的具体迭代器类即可,原有类库代码无须修改,符合“开闭原则”;

    如果需要为聚合类更换一个迭代器,只需要增加一个新的具体迭代器类作为抽象迭代器类的子类,重新实现遍历方法,原有迭代器代码无须修改,也符合“开闭原则”;

    但是如果要在迭代器中增加新的方法,则需要修改抽象迭代器源代码,这将违背“开闭原则”。

    迭代器模式在JDK-ArrayList集合应用的源码分析

    在这里插入图片描述
    角色分析说明

    • 内部类Itr 充当具体实现迭代器Iterator 的类, 作为ArrayList 内部类
    • List 就是充当了聚合接口,含有一个iterator() 方法,返回一个迭代器对象
    • ArrayList 是实现聚合接口List 的子类,实现了iterator()
    • Iterator 接口系统提供
    • 迭代器模式解决了 不同集合(ArrayList ,LinkedList) 统一遍历问题

    优点

    1. 提供一个统一的方法遍历对象,客户不用再考虑聚合的类型,使用一种方法就可以遍历对象了。
    2. 隐藏了聚合的内部结构,客户端要遍历聚合的时候只能取到迭代器,而不会知道聚合的具体组成。
    3. 提供了一种设计思想,就是一个类应该只有一个引起变化的原因(叫做单一责任
      原则)。在聚合类中,我们把迭代器分开,就是要把管理对象集合和遍历对象集
      合的责任分开,这样一来集合改变的话,只影响到聚合对象。而如果遍历方式改变的话,只影响到了迭代器。
    4. 当要展示一组相似对象,或者遍历一组相同对象时使用, 适合使用迭代器模式

    缺点
    每个聚合对象都要一个迭代器,会生成多个迭代器不好管理类

    展开全文
  • 迭代器模式(Iterator)C++实现
  • 迭代器模式Demo

    2017-05-23 15:10:43
    迭代器模式Demo
  • 迭代器模式java实现

    2017-11-21 22:53:14
    设计模式之迭代器模式的java小程序实现!简单的代码!
  • 本文实例讲述了Android编程设计模式之迭代器模式。分享给大家供大家参考,具体如下: 一、介绍 迭代器模式(Iterator Pattern)又称为游标(Cursor)模式,是行为型设计模式之一。迭代器模式算是一个比较古老的设计...
  • 迭代器在STL运用广泛,类似容器的迭代已经成为其重要特性,而迭代器模式则是利用迭代器概念进行的抽象运用,迭代器模式运用广泛和有用,因为其能够不考虑数据的存储方式,而是直接面对数据进行迭代,也就是说我们...
  • 迭代器模式:提供一种方法顺序访问一个聚合对象中个各个元素,而不暴露该对像的内部表示. 迭代器模式应该是最为熟悉的模式了,最简单的证明就是我在实现组合模式、享元模式、观察者模式中就直接用到了 STL 提供的迭代...
  • 何为迭代器模式?  迭代器提供了一种顺序访问集合对象中元素的方法,而无需暴漏结构的底层表示和细节。遍历集合中元素的职能从集合本身转移到迭代器对象。迭代器定义了一个用于访问集合元素并记录当前元素的接口。...
  • 迭代器模式分为内部迭代器和外部迭代器,内部迭代器就是在函数内部定义好迭代的规则,它完全接手整个迭代的过程,外部只需一次初始调用。 内部迭代器 以下自行实现的类似jquery中$.each()的each()函数就是内部迭代...
  • 迭代器模式实例: <?php class ConcreteIterator implements Iterator{ private $position = 0; private $arr; function __construct(array $arr){ $this->arr = $arr; } function rewind(){ $

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 220,865
精华内容 88,346
关键字:

迭代器模式