前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【设计模式】行为型模式-第 3 章第 4 讲【迭代器模式】

【设计模式】行为型模式-第 3 章第 4 讲【迭代器模式】

作者头像
跟着飞哥学编程
发布2022-11-16 13:48:18
1720
发布2022-11-16 13:48:18
举报

目录

前言

1、意图

2、实现

3、使用场景

4、迭代器模式的优缺点


前言

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

迭代器模式可能是 Java 中最广为人知的模式之一。Java 程序员在使用集合(collection)时,并不需要关注其类型是数组、列表、集合(set)还是其他,有些人并不知道这些集合包其实是使用了迭代器模式来实现的。

1、意图

迭代器模式提供了一种顺序遍历集合对象元素而不暴露其内部实现的方法。

2、实现

迭代器模式基于两个抽象类或接口,可以通过成对的具体类来实现。

类图如下图所示:

 迭代器模式使用了以下类:

  • Aggregate(抽象容器):应该由所有类实现的抽象类,并且可以由迭代器遍历。这对应于 java.util.Collection 接口。
  • Iterator(抽象迭代器):抽象迭代器是迭代器抽象类,它定义遍历容器对象的操作以及返回对象的操作。
  • ConcreteAggregate(具体容器):具体容器可以实现内部不同的结构,但会暴露处理遍历容器的具体迭代器。
  • ConcreteIterator(具体迭代器):这是处理特定具体容器类的具体迭代器。实际上,对于每个具体容器,必须实现一个具体迭代器。

每一个 Java 程序员在日常工作中都会使用迭代器。

让我们看看具体代码如何实现迭代器。

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

1、创建接口 Iterator.java

Iterator.java

代码语言:javascript
复制
package com.zhaoyanfei.designpattern.IteratorPattern;


/**
 * 
 * 抽象迭代器 Iterator
 * @Date 2022年10月22日
 * @author zhaoYanFei
 *
 */
public interface Iterator {

	public boolean hasNext();
	public Object next();
	
}

 Container.java

代码语言:javascript
复制
package com.zhaoyanfei.designpattern.IteratorPattern;


/**
 * 
 * 抽象容器 Container
 * @Date 2022年10月22日
 * @author zhaoYanFei
 *
 */
public interface Container {
	
	public Iterator getIterator();
	
}

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

NameRepository.java

代码语言:javascript
复制
package com.zhaoyanfei.designpattern.IteratorPattern;

/**
 * 
 * 实现了 Container 接口的实体类
 * @Date 2022年10月22日
 * @author zhaoYanFei
 *
 */
public class NameRepository implements Container {
	
	public String names[] = {"Robert" , "John" ,"Julie" , "Lora"};
	
	@Override
	public Iterator getIterator() {
		// TODO Auto-generated method stub
		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

代码语言:javascript
复制
package com.zhaoyanfei.designpattern.IteratorPattern;


/**
 * 
 * 迭代器测试类 IteratorPatternDemo
 * @Date 2022年10月22日
 * @author zhaoYanFei
 *
 */
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);
		}    
	}
	
}

3、使用场景

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

4、迭代器模式的优缺点

优点

1、它支持以不同的方式遍历一个聚合对象。

2、迭代器简化了聚合类。

3、在同一个聚合上可以有多个遍历。

4、在迭代器模式中,增加新的聚合类和迭代器类都很方便,无须修改原有代码。

缺点

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-10-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 1、意图
  • 2、实现
  • 3、使用场景
  • 4、迭代器模式的优缺点
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档