设计模式(15):迭代器模式

介绍

  • 提供一中可以遍历聚合对象的方式。又称为: 游标cursor模式

迭代器模式角色

  • 抽象聚合类(Aggregate):提供了聚合相关的方法,并提供获取迭代器的方法;
  • 具体集合类(ConcreteAggregate):实现了抽象聚合类;
  • 抽象迭代器(Iterator):定义了迭代相关的方法;
  • 具体迭代器(ConcreteIterator): 实现了抽象迭代器的方法。

场景:

  • 需要以一种特定的方式遍历聚合对象;
  • 聚合对象:存储数据
  • 迭代器:遍历数据

开发中常见的场景

  • JDK内置的迭代器(List/Set)

代码实现

  • 抽象聚合类
java 复制代码
/**
 * 抽象聚合类
 */
public interface Aggregate {
	/**
	 * 添加对象
	 * @param obj
	 */
	void addObject(Object obj);
	/**
	 * 移除对象
	 * @param obj
	 */
	void removeObject(Object obj);
	/**
	 * 获取迭代器方法
	 * @return
	 */
	MyIterator iterator();
}
  • 抽象迭代器
java 复制代码
/**
 *	抽象迭代器
 */
public interface MyIterator {
	/**
	 * 当前游标置零
	 */
	void first(); 
	/**
	 * 将游标指向下一个元素
	 */
	void next();	
	/**
	 * 是否存在下一个元素
	 * @return
	 */
	boolean HasNext();  
	/**
	 * 判断当前对象是否第一个元素
	 * @return
	 */
	boolean isfirst();	
	/**
	 * 判断当前对象是否最后一个元素
	 * @return
	 */
	boolean isLast();		
	/**
	 * 获取当期游标对象
	 * @return
	 */
	Object getCurrentObj();	
}
  • 具体聚合类,内部类方法定义具体迭代器
java 复制代码
public class ConcreteAggregate implements Aggregate {
	private List<Object> list = new ArrayList<Object>();
	/**
	 * 添加对象
	 * @param obj
	 */
	@Override
	public void addObject(Object obj){
		list.add(obj);
	}
	/**
	 * 移除对象
	 * @param obj
	 */
	@Override
	public void removeObject(Object obj){
		list.remove(obj);
	}	
	/**
	 * 获取迭代器方法
	 * @return
	 */
	@Override
	public MyIterator iterator() {
		return new ConcreteIterator();
	} 
	/**
	 * 使用内部类定义迭代器,可以直接使用外部类的属性
	 */
	private class ConcreteIterator implements MyIterator{
		 /**
		  * 定义游标---用于记录遍历List容器时的位置
		  */
		private int cursor; 
		/**
		 * 当前游标置零
		 */
		@Override
		public void first() {
			cursor=0;
		}
		/**
		 * 获取当期游标对象
		 */
		@Override
		public Object getCurrentObj() {
			return list.get(cursor);
		}	
		/**
		 * 将游标指向下一个元素
		 */
		@Override
		public void next() {
			if(cursor<list.size()){
				cursor++;
			}
		}
		/**
		 * 是否存在下一个元素
		 */
		@Override
		public boolean HasNext() {
			if(cursor<list.size()){
				return true;
			}
			return false;
		}
		/**
		 * 判断当前对象是否第一个元素
		 */
		@Override
		public boolean isfirst() {
			return cursor==0?true:false;
		}
		/**
		 * 判断当前对象是否最后一个元素
		 */
		@Override
		public boolean isLast() {
			return cursor==(list.size()-1)?true:false;
		}
	}
}
  • 测试调用
java 复制代码
public static void main(String[] args) {
		Aggregate cma = new ConcreteMyAggregate();
		cma.addObject("aaa");
		cma.addObject("bbb");
		cma.addObject("ccc");
		MyIterator iterator=cma.iterator();
		while(iterator.HasNext()){
			System.out.println(iterator.getCurrentObj());
			iterator.next();
		}
		System.out.println("----------------------------------");
		cma.removeObject("bbb");
		MyIterator iter=cma.iterator();
		while(iter.HasNext()){
			System.out.println(iter.getCurrentObj());
			iter.next();
		}
	}

更多设计模式学习:

设计模式(1):介绍

设计模式(2):单例模式

设计模式(3):工厂模式

设计模式(4):建造者模式

设计模式(5):原型模式

设计模式(6):桥接模式

设计模式(7):装饰器模式

设计模式(8):组合模式

设计模式(9):外观模式

设计模式(10):享元模式

设计模式(11):适配器模式

设计模式(12):代理模式

设计模式(13):模板方法模式

设计模式(14):命令模式

设计模式持续更新中...

相关推荐
接着奏乐接着舞2 小时前
大模型开发 agent 知识库
java
xuhaoyu_cpp_java2 小时前
SpringBoot学习(四)
java·经验分享·spring boot·笔记·学习
plainGeekDev2 小时前
kapt 替换为 KSP
android·java·kotlin
蜡台3 小时前
通过Gradle脚本声明更改Java变量
android·java·开发语言·python·kotlin·gradle·groovy
Larcher3 小时前
当 AI 学会写代码:一个自动生成 React 项目的 Agent 实战
人工智能·设计模式·程序员
程序员天天困3 小时前
后端视角看 EventBus:发布订阅总线的原理、场景与用法
java·后端
要开心吖ZSH3 小时前
AI医疗分诊与健康咨询助手agent开发——(4-2)从零到一:我给AI医疗分诊助手加了个“知识库大脑“,终于搞懂了RAG是什么
java·docker·agent·医疗·rag
AI人工智能+电脑小能手4 小时前
【大白话说Java面试题 第179题】【07_Redis篇】第15题:什么是 Redlock 算法?
java·redis·分布式锁·高可用·redlock
怎么比啊都是大神5 小时前
关于==null、isEmpty()和StrUtil.isBlank()
java
唐青枫5 小时前
Java Neo4j 实战指南:从图模型、Cypher 到 Spring Boot 关系查询
java