设计模式(十一):迭代器模式

一、概述

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

二、解决问题

  迭代器模式就是提供一种遍历元素的统一接口,用一致的方法遍历聚合元素。试想,如果我们的聚合元素是用不同的方式实现的,有些用了数组,有些用了java的集合类,或者还有其他方式,当客户端要遍历这些元素的时候就要使用多种遍历方式,而且还会暴露元素的内部结构。

三、应用实例

  下面我用一个在页面展示一个学校院系结构的例子来讲解迭代器的用法,讲完例子后我们再来看看迭代器的结构类图。现在我们的需求是这样,要在一个页面中展示出学校的院系组成,它应该是树状结构的,一个学校有多个学院,一个学院有多个系。当然了,页面的具体代码就不写了,我们就来分析后台的实现方法。

  前面学了面向接口编程,我们现在可以把学院抽象出来做成一个接口,设定里面方法有getName,addDepartment(增加一个系),一个可以遍历全部系的方法(暂且取名为CreateIterator,就是返回一个迭代器的方法)。看看接口的代码实现

package com.jet.someinterface;

import java.util.Iterator;

/**
 * Created by Administrator on 2016/11/14.
 */
public interface College {

    public String getName();

    /**
     * 增加一个系的方法
     */
    public void addDepartment(String name,String description);

    /**
     *返回一个迭代器用来遍历每一个系
     */
    public Iterator createIterator();

} 

  学院下面的是专业,我们把专业的对象创建出来

package com.jet.com.jet.vo;

/**
 * Created by Administrator on 2016/11/14.
 * description:专业对象
 */
public class DepartmentVo {
    private String name;
    private String description;

    public DepartmentVo(String name, String description) {
        this.name = name;
        this.description = description;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getName() {

        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

  创建第一学院对象(计算机学院),及其对应的迭代器

package com.jet.impl;

import com.jet.com.jet.vo.DepartmentVo;
import com.jet.someinterface.College;

import java.util.Iterator;

/**
 * Created by Administrator on 2016/11/14.
 * description:计算机学院
 */
public class ComputerCollege implements College{
    DepartmentVo[] departmentVos;//用来放置专业对象,注意这里用的是数组
    int numberOfDepartments = 0;//保存当前数组已有对象数
    static final int MAX_DEPARTMENTS = 4;//控制专业数组大小

    public String getName() {
        return "计算机学院";
    }

    public ComputerCollege() {
        departmentVos = new DepartmentVo[MAX_DEPARTMENTS];
        addDepartment("计算机科学与技术","计算机科学与技术");
        addDepartment("软件工程 ","软件工程 ");
        addDepartment("网络工程","网络工程");
        addDepartment("信息安全","信息安全");
    }

    public void addDepartment(String name,String description) {
        if(numberOfDepartments >= MAX_DEPARTMENTS){
            System.out.println("已超过学院最专业数限制,不能添加专业了!");
        }else{
            DepartmentVo departmentVo = new DepartmentVo(name,description);
            departmentVos[numberOfDepartments] = departmentVo;
            numberOfDepartments = numberOfDepartments + 1;
        }
    }

    public Iterator createIterator() {
        //返回一个遍历器
        return new ComputerCollegeIterator(departmentVos);
    }
}
package com.jet.impl;

import com.jet.com.jet.vo.DepartmentVo;

import java.util.Iterator;

/**
 * Created by Administrator on 2016/11/14.
 * decription:计算机学院的遍历器,我们这里是实现了java自带的便利器Iterator
 */
public class ComputerCollegeIterator implements Iterator{
    DepartmentVo[] departmentVos;
    int position = 0;//遍历的位置

    public ComputerCollegeIterator(DepartmentVo[] departmentVos) {
        this.departmentVos = departmentVos;
    }

    public boolean hasNext() {
        if(position >= departmentVos.length || departmentVos[position] == null ){
            return false;
        }else{
            return true;
        }
    }

    public Object next() {
        DepartmentVo departmentVo = departmentVos[position];
        position = position + 1;
        return departmentVo;
    }

    //删除的方法我们暂时不实现
    public void remove() {
    }
}

  创建第二个学院(信息工程学院)及其迭代器

package com.jet.impl;

import com.jet.com.jet.vo.DepartmentVo;
import com.jet.someinterface.College;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * Created by Administrator on 2016/11/14.
 * description:信息工程学院
 */
public class InfoEngineeringCollege implements College{
    List<DepartmentVo> departmentVoList;//注意这里我们使用了集合来放置专业对象了

    public String getName() {
        return "信息工程学院";
    }

    public InfoEngineeringCollege() {
        this.departmentVoList = new ArrayList<DepartmentVo>();
        addDepartment("电子信息工程","电子信息工程");
        addDepartment("信息工程","信息工程");
        addDepartment("通信工程","通信工程");
    }

    public void addDepartment(String name, String description) {
        DepartmentVo departmentVo = new DepartmentVo(name,description);
        departmentVoList.add(departmentVo);
    }

    public Iterator createIterator() {
        return new InfoEngineeringCollengIterator(departmentVoList);
    }
}
package com.jet.impl;

import com.jet.com.jet.vo.DepartmentVo;
import java.util.Iterator;
import java.util.List;

/**
 * Created by Administrator on 2016/11/14.
 * description:信息工程学院迭代器
 */
public class InfoEngineeringCollengIterator  implements Iterator{
    int index = 0;
    List<DepartmentVo> departmentVoList;

    public InfoEngineeringCollengIterator(List<DepartmentVo> departmentVoList) {
        this.departmentVoList = departmentVoList;
    }

    public boolean hasNext() {
        if(index >= departmentVoList.size() ){
            return false;
        }else {
            index = index + 1;
            return true;
        }

    }

    public Object next() {
        return departmentVoList.get(index);
    }

    public void remove() {

    }
} 

  创建数据输出类(也就是客户端)

package com.jet.impl;

import com.jet.com.jet.vo.DepartmentVo;
import com.jet.someinterface.College;
import java.util.Iterator;
import java.util.List;

/**
 * Created by Administrator on 2016/11/15.
 * description:模拟向页面输出院系信息的类,该类负责遍历每个专业并打印其信息
 */
public class OutputInfoImpl {
    //学院集合
    List<College> collegeList;

    public OutputInfoImpl(List<College> collegeList) {
        this.collegeList = collegeList;
    }

    public void printDepartement(){
        //java的集合实现了迭代器,可以直接调用方法取到
        Iterator departmentIterator = collegeList.iterator();
        while (departmentIterator.hasNext()){
            College college = (College) departmentIterator.next();
            System.out.println("--------" + college.getName() + "有以下专业-----------");
            printDepartment(college.createIterator());
        }
    }

    public void printDepartment(Iterator iterator){
        while (iterator.hasNext()){
            DepartmentVo departmentVo = (DepartmentVo) iterator.next();
            System.out.println(departmentVo.getName());
        }
    }

}

  测试迭代器

package com.jet.test;

import com.jet.impl.ComputerCollege;
import com.jet.impl.InfoEngineeringCollege;
import com.jet.impl.OutputInfoImpl;
import com.jet.someinterface.College;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Administrator on 2016/11/15.
 * description:测试迭代器
 */
public class IteratorTest {
    public static void main(String[] args) {
        //创建学院集合
        List<College> collegeList = new ArrayList<College>();
        College computerCollege = new ComputerCollege();
        College infoEngineeringCollege = new InfoEngineeringCollege();
        collegeList.add(computerCollege);
        collegeList.add(infoEngineeringCollege);

        OutputInfoImpl outputInfo = new OutputInfoImpl(collegeList);
        outputInfo.printDepartement();
    }
}

测试结果:

四、结构类图

五、使用场景

  当要展示一组相似对象,或者遍历一组相同对象时使用。

六、优缺点

  1、优点

  (1)、提供一个统一的方法遍历对象,客户不用再考虑聚合的类型,使用一种方法就可以遍历对象了。

  (2)、隐藏了聚合的内部结构,客户端要遍历聚合的时候只能取到迭代器,而不会知道聚合的具体组成。

  (3)、提供了一种设计思想,就是一个类应该只有一个引起变化的原因(叫做单一责任原则)。在聚合类中,我们把迭代器分开,就是要把管理对象集合和遍历对象集合的责任分开,这样一来集合改变的话,只影响到聚合对象。而如果遍历方式改变的话,只影响到了迭代器。

  2、缺点

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

时间: 2024-07-28 17:32:41

设计模式(十一):迭代器模式的相关文章

【设计模式】——迭代器模式

迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示.当你需要访问一个聚集对象,而且不管这些对象是什么都需要遍历的时候,或者你需要对聚集有多种方式遍历时,你就应该考虑用迭代器模式,为遍历不同的聚集结构提供如开始.下一个.是否结束.当前哪一项等统一接口. #include <iostream> #include <vector> using namespace std; typedef string object; //Iterato

设计模式之迭代器模式(Iterator)

1.定义 迭代器模式提供一种方法访问一个容器对象中的各个元素,而又不需暴露该对象的内部细节. 基本上没有人会单独写一个迭代器,除非是产品性质的开发. 2.通用类图 Iterator抽象迭代器:抽象迭代器负责定义访问和遍历元素的接口,而且基本上是有固定的3个方法:first()获得第一个元素:next()访问下一个元素:isDone()是否已经访问到底部(Java 叫做hasNext()方法). ConcreteIterator具体迭代器:具体迭代器角色要实现迭代器接口,完成容器元素的遍历. Ag

2018.4.30 设计模式之迭代器模式

设计模式之迭代器模式 1.定义/概念 迭代器模式是Java和.Net编程环境中非常常用的设计模式.这种设计模式用于顺序访问集合对象的元素要知道集合对象的底层表示.迭代器模式属于行为型模式 迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示. 2.角色和定义 ● Iterator抽象迭代器 抽象迭代器负责定义访问和遍历元素的接口,而且基本上是有固定的3个方法:first()获得第一个元素,next()访问下一个元素,isDone()是否已经访问

Python进阶:设计模式之迭代器模式

在软件开发领域中,人们经常会用到这一个概念--"设计模式"(design pattern),它是一种针对软件设计的共性问题而提出的解决方案.在一本圣经级的书籍<设计模式:可复用面向对象软件的基础>(1991年,Design Patterns - Elements of Reusable Object-Oriented Software)中,它提出了23种设计模式.迭代器模式就是其中的一种,在各种编程语言中都得到了广泛的应用. 本文将谈谈 Python 中的迭代器模式,主要内

Java设计模式菜鸟系列(十一)迭代器模式建模与实现

转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39807741 迭代器模式(Iterator):提供了一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 一.uml建模: 二.代码实现 /** * 示例:迭代器模式 * */ interface Iterator { /** 前移 */ public Object previous(); /** 后移 */ public Object next(); /** 判断是否有下

【设计模式】迭代器模式

迭代器模式(Iterator Pattern)是 Java 和 .Net 编程环境中非常常用的设计模式.这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示. 迭代器模式属于行为型模式. 介绍 意图:提供一种方法顺序访问一个聚合对象中各个元素, 而又无须暴露该对象的内部表示. 主要解决:不同的方式来遍历整个整合对象. 何时使用:遍历一个聚合对象. 如何解决:把在元素之间游走的责任交给迭代器,而不是聚合对象. 关键代码:定义接口:hasNext, next. 应用实例:JAVA 中的

php设计模式之迭代器模式

今天的PHP设计模式系列的主角是迭代器(Iterator)模式,迭代器模式提供了抽象:位于对象图不明部分的一组对象(或标量)集合上的迭代. 迭代器(Iterator)模式,它在一个很常见的过程上提供了一个抽象:位于对象图不明部分的一组对象(或标量)集合上的迭代.迭代有几种不同的具体执行方法:在数组属性,集合对象,数组,甚至一个查询结果集之上迭代. 在对象的世界里,迭代器模式要维持类似数组的功能,看作是一个非侵入性对象刻面(facet),Client类往往分离自真实对象实现,指iterator接口

设计模式之迭代器模式--- Pattern Iterator

模式的定义 迭代器模式定义: Provide a way to access the elements of an aggregate object sequentially without exposing its underlying representation. 提供一种方法访问一个容器对象中各个元素,而又不需要暴露对象的内部细节. 类型 行为类 模式的使用场景 方便遍历访问容器内的元素 优点 面向对象设计原则中的单一职责原则,对于不同的功能,我们要尽可能的把这个功能分解出单一的职责,不

设计模式之迭代器模式(Iterator Pattern)

这篇博客,我们要详细讲解的是迭代器模式(Iterator Pattern),将要讲解的内容有:迭代器模式 的定义,作用,详细设计分析等方面. 一.Pattern name 迭代器模式(Iterator Pattern) : 提供一种方法顺序访问一个聚合对象中各个元素,而又不需暴露该对象的内部表示.--<设计模式 可复用面向对象软件的基础> 二.Problem 在我们实际编程的过程中,经常会遇到下面这种情况: 当我们需要遍历某个集合的时候,常常调用某个类的一个方法,返回一个集合类型的数据,如下:

设计模式之迭代器模式(Iterator)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于怎样创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化托付给还有一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些详细的类的信息封装起来.第二,它们隐藏了这些类的实例是怎样被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,