【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 通用类图

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

【Java设计模式】 Java设计模式之(八)迭代器模式(Iterator Pattern)_第1张图片

 

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

【Java设计模式】 Java设计模式之(八)迭代器模式(Iterator Pattern)_第2张图片

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

2.2 代码实现

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

import java.util.Iterator;

/**
 * 

IProjectIterator 此接口用于:

*

@author:hujm

*

@date:2021年02月23日 15:26

*

@remark: * 大家可能很奇怪,你定义的这个接口方法、变量都没有,有什么意义呢?有意义,所有的 Java 书上都一直 * 说是面向接口编程,你的接口是对一个事物的描述,也就是说我通过接口就知道这个事物有哪些方法,哪些属性, * 我们这里的 IProjectIterator 是要建立一个指向 Project 类的迭代器,目前暂时定义的就是一个通用的迭 * 代器,可能以后会增加 IProjectIterator 的一些属性或者方法。当然了,你也可以在实现类上实现两个接口, * 一个是 Iterator,一个是 IProjectIterator(这时候,这个接口就不用继承 Iterator),杀猪杀尾巴, * 各有各的杀发。 *

*/ public interface IProjectIterator extends Iterator { }
package com.iot.practice.designpattern.iterator.iteratorpattern;

/**
 * 

IProject 此接口用于:

*

@author:hujm

*

@date:2021年02月23日 15:15

*

@remark:

*/ 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;

/**
 * 

Project 此类用于:

*

@author:hujm

*

@date:2021年02月23日 15:17

*

@remark:

*/ public class Project implements IProject{ /** * 定义一个项目列表,说有的项目都放在这里 */ private ArrayList projectList = new ArrayList(); /** * 项目名称 */ 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;

/**
 * 

ProjectIterator 此类用于:

*

@author:hujm

*

@date:2021年02月23日 15:27

*

@remark:定义一个迭代器

*/ public class ProjectIterator implements IProjectIterator { /** * 所有的项目都放在这里ArrayList中 */ private ArrayList projectList = new ArrayList(); private int currentItem = 0; /** * 构造函数传入projectList * * @param projectList 所有项目集合 */ public ProjectIterator(ArrayList 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++); } }

 

 

 

完结!

你可能感兴趣的:(Java设计模式,设计模式,java,编程语言,后端,c++)