【Java设计模式】 Java设计模式之(八)迭代器模式(Iterator Pattern)

本文目录

一、迭代器概述

1.1 优缺点

1.2 使用场景

1.3 注意事项

二、代码实现

2.1 通用类图

2.2 代码实现


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

一、迭代器概述

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

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

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

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

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

应用实例:JAVA 中的 iterator。

1.1 优缺点

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

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

1.2 使用场景

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

1.3 注意事项

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

二、代码实现

所有设计模式的代码实现例子都可在码云上查看哦,感兴趣的可以查看哈,码云地址:https://gitee.com/no8g/java-design-patterns


2.1 通用类图

上面的例子就使用了迭代器模式,我们来看看迭代器的通用类图:

类图是很简单,但是你看用起来就很麻烦,就比如上面例子的两个实现方法,你觉的那个简单?当然是第一个了!23 个设计模式是为了简化我们代码和设计的复杂度、耦合程度,为什么我们用了这个迭代器模式程序会复杂了一些呢?这是为什么?因为从 JDK 1.2 版本开始增加 java.util.Iterator 这个接口,并逐步把Iterator 应用到各个聚集类(Collection)中,我们来看 JDK 1.5 的 API 帮助文件,你会看到有一个叫java.util.Iterable 的接口,看看有多少个接口继承了它:

java.util.Iterable 接口只有一个方法:iterator(),也就说通过 iterator()这个方法去遍历聚集类中的所有方法或属性,基本上现在所有的高级的语言都有 Iterator 这个接口或者实现,Java 已经把迭代器给我们准备了,我们再去写迭代器,是不是“六指儿抓痒,多一道子”?所以呀,这个迭代器模式也有点没落了,基本上很少有项目再独立写迭代器了,直接使用 List 或者 Map 就可以完整的解决问题。

2.2 代码实现

package com.iot.practice.designpattern.iterator.iteratorpattern;

import java.util.Iterator;

/**
 * <p>IProjectIterator 此接口用于:</p>
 * <p>@author:hujm</p>
 * <p>@date:2021年02月23日 15:26</p>
 * <p>@remark:
 * 大家可能很奇怪,你定义的这个接口方法、变量都没有,有什么意义呢?有意义,所有的 Java 书上都一直
 * 说是面向接口编程,你的接口是对一个事物的描述,也就是说我通过接口就知道这个事物有哪些方法,哪些属性,
 * 我们这里的 IProjectIterator 是要建立一个指向 Project 类的迭代器,目前暂时定义的就是一个通用的迭
 * 代器,可能以后会增加 IProjectIterator 的一些属性或者方法。当然了,你也可以在实现类上实现两个接口,
 * 一个是 Iterator,一个是 IProjectIterator(这时候,这个接口就不用继承 Iterator),杀猪杀尾巴,
 * 各有各的杀发。
 * </p>
 */
public interface IProjectIterator extends Iterator {
}
package com.iot.practice.designpattern.iterator.iteratorpattern;

/**
 * <p>IProject 此接口用于:</p>
 * <p>@author:hujm</p>
 * <p>@date:2021年02月23日 15:15</p>
 * <p>@remark:</p>
 */
public interface IProject {
    /**
     * 增加项目
     *
     * @param name 项目名称
     * @param num 项目成员数量
     * @param cost 项目费用
     */
    public void add(String name,int num,int cost);

    /**
     * 从老板这里看到的就是项目信息
     *
     * @return 项目信息
     */
    public String getProjectInfo();

    /**
     * 获得一个可以被遍历的对象
     *
     * @return 一个可以被遍历的对象
     */
    public IProjectIterator iterator();
}
package com.iot.practice.designpattern.iterator.iteratorpattern;

import java.util.ArrayList;

/**
 * <p>Project 此类用于:</p>
 * <p>@author:hujm</p>
 * <p>@date:2021年02月23日 15:17</p>
 * <p>@remark:</p>
 */
public class Project implements IProject{
    /**
     * 定义一个项目列表,说有的项目都放在这里
     */
    private ArrayList<IProject> projectList = new ArrayList<IProject>();

    /**
     * 项目名称
     */
    private String name = "";

    /**
     * 项目成员数量
     */
    private int num = 0;

    /**
     * 项目费用
     */
    private int cost = 0;

    public Project(){}

    private Project(String name, int num, int cost) {
        // 赋值到类的成员变量中
        this.name = name;
        this.num = num;
        this.cost = cost;
    }

    @Override
    public void add(String name, int num, int cost) {
        this.projectList.add(new Project(name, num, cost));
    }

    @Override
    public String getProjectInfo() {

        String info = "";

        //获得项目的名称
        info = info+ "项目名称是:" + this.name;
        //获得项目人数
        info = info + "\t项目人数: "+ this.num;
        //项目费用
        info = info+ "\t 项目费用:"+ this.cost;

        return info;
    }

    @Override
    public IProjectIterator iterator() {
        return new ProjectIterator(this.projectList);
    }
}
package com.iot.practice.designpattern.iterator.iteratorpattern;

import java.util.ArrayList;

/**
 * <p>ProjectIterator 此类用于:</p>
 * <p>@author:hujm</p>
 * <p>@date:2021年02月23日 15:27</p>
 * <p>@remark:定义一个迭代器</p>
 */
public class ProjectIterator implements IProjectIterator {

    /**
     * 所有的项目都放在这里ArrayList中
     */
    private ArrayList<IProject> projectList = new ArrayList<IProject>();

    private int currentItem = 0;

    /**
     * 构造函数传入projectList
     *
     * @param projectList 所有项目集合
     */
    public ProjectIterator(ArrayList<IProject> projectList) {
        this.projectList = projectList;
    }

    /**
     * 判断是否还有元素,必须实现
     *
     * @return 是否为true
     */
    @Override
    public boolean hasNext() {
        // 定义一个返回值
        boolean b = true;
        if (this.currentItem >= projectList.size() || this.projectList.get(this.currentItem) == null) {
            b = false;
        }
        return b;
    }

    /**
     * 取得下一个值,必须实现
     *
     * @return 下一个值
     */
    @Override
    public IProject next() {
        return this.projectList.get(this.currentItem++);
    }
}

 

 

完结!

猜你喜欢

转载自blog.csdn.net/weixin_44299027/article/details/114010693