当前位置: 首页 > article >正文

迭代器模式

🍀参考书籍:图解设计模式,提取码5i9c

一.迭代器模式是什么?

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

迭代器模式属于行为型模式,其核心思想是通过定义一个迭代器接口,该接口包含访问和遍历元素的基本方法,如next()hasNext()currentItem()等。通过实现这个接口的具体迭代器类,可以维护对集合的引用,并跟踪当前遍历的位置,从而使得用户可以通过统一的接口来访问不同类型的聚合对象,而无需关心这些对象的内部结构。这种模式解决了不同聚合对象(如数组、链表、自定义结构等)需要不同遍历方式的问题,通过提供一个统一的迭代器接口,简化了对各种聚合对象的遍历操作。

迭代器模式实现类图:

二.实例

实例一:

创建两个接口:Aggregate和Iterator,和三个类:书,书架,书架迭代器。

关系如下UML图所示

Aggreate.java

public interface Aggregate {
public abstract Iterator iterator();
}

Book.java



public class Book {
private String name;
Book(String name){
	this.name=name;
}
	
String getName() {
	return name;
}
}

BookShelf.java




public class BookShelf implements Aggregate{
private	Book Books[];
	private int last=0;
	BookShelf(int Maxsize){
		Books=new Book[Maxsize];
	}
	Book getBookAt(int Index) {
		return Books[Index];
	}
	void appendBook(Book book) {
		Books[last++]=book;
	}
	int getlength() {
		return last;
	}
	public Iterator iterator(){
		 return new BookShelfIterator(this);
	 }
}

BookShelfIterator.java



public class BookShelfIterator implements Iterator{
private BookShelf bookshelf;
private int index;
 BookShelfIterator(BookShelf bookshelf){
		this.bookshelf=bookshelf;
		index=0;
	}
	public Boolean hasNext() {
		if(bookshelf.getlength()>index) {
			return true;
		}
		else return false;
	}
	@Override
	public Object next() {
		// TODO Auto-generated method stub
		Book book=bookshelf.getBookAt(index);
			index++;
		return book;
	}
	
}

Iterator.java



public interface Iterator {
abstract Object next();
abstract Boolean hasNext();
}

Main.java

public class Main {
public static void main(String []args) {
	BookShelf bookshelf=new BookShelf(10);
	bookshelf.appendBook(new Book("Jane Eyre"));
	bookshelf.appendBook(new Book("Alive"));
	bookshelf.appendBook(new Book("Shouting"));
	bookshelf.appendBook(new Book("A Dream in Red Mansions"));	
	BookShelfIterator it=new BookShelfIterator(bookshelf);
	while(it.hasNext()) {
		Book book=(Book)it.next();
		System.out.println(book.getName());
	}
}
}

运行结果:

实例二:

增加一个比赛排名表的遍历,UML图如下,可以看出和书架的遍历是共享AggregateIterator这两个接口的,这就是迭代器模式的好处。无论增加多少个需要遍历的聚合对象,无论它们的类型有多少种,只要实现两个接口就可以轻松实现遍历。结构清晰。

Main.java


public class Main {
public static void main(String []args) {
	Competition_leaderbord competition_leaderbord=new Competition_leaderbord(10);
	competition_leaderbord.appendCompetitor(new Competitor("XiaoWang",8));
	competition_leaderbord.appendCompetitor(new Competitor("XiaoZhang",3));
	competition_leaderbord.appendCompetitor(new Competitor("XiaoSong",6));
	competition_leaderbord.appendCompetitor(new Competitor("XiaoWu",10));
	leaderboardIterator it=(leaderboardIterator)competition_leaderbord.iterator();
	while(it.hasNext()) {
		Competitor competitor=(Competitor)it.next();
		System.out.println(competitor.getname()+"名次是:"+competitor.getranking());

				}
	
}
}

Competition_leaderbord .java



public class Competition_leaderbord implements Aggregate{
private	Competitor competitiors[];
private int last=0;
Competition_leaderbord(int MaxSize){
	competitiors=new Competitor[MaxSize];
}
Competitor getCompetitorAt(int index) {
	return competitiors[index];
}
void appendCompetitor(Competitor competitor) {
	competitiors[last++]=competitor;
}
int getLength() {
	return last;
}
@Override
public Iterator iterator() {
	// TODO Auto-generated method stub
	return new leaderboardIterator(this);
}
}

Competitor.java

public class Competitor {
private String name;
private int ranking;
Competitor(String name, int ranking){
	this.name=name;
	this.ranking=ranking;
}
String getname() {
	return name;
}
int getranking() {
	return ranking;
	}
}

leaderboardIterator.java

public class leaderboardIterator implements Iterator{
private	Competition_leaderbord competition_leaderboard;
private int index=0;
leaderboardIterator(Competition_leaderbord competition_leaderboard){
	this.competition_leaderboard=competition_leaderboard;
}
@Override
public Object next() {
	// TODO Auto-generated method stub
		Competitor competitor=competition_leaderboard.getCompetitorAt(index);
		index++;
	return competitor;
}
@Override
public Boolean hasNext() {
	// TODO Auto-generated method stub
	if(competition_leaderboard.getLength()>index)
	return true;
	else return false;
}
 

}

运行结果:

习题:

习题1

答:

import java.util.*;
public class BookShelf implements Aggregate{
private ArrayList<Book>Books;
	BookShelf(int InitialSize){
		Books=new ArrayList<Book>(InitialSize);
	}
	Book getBookAt(int Index) {
		return Books.get(Index);
	}
	void appendBook(Book book) {
		Books.add(book);
	}
	int getlength() {
		return Books.size();
	}
	public Iterator iterator(){
		 return new BookShelfIterator(this);
	 }
}


http://www.kler.cn/news/284795.html

相关文章:

  • TWRP 使用帮助 第三方Recovery
  • 给鼠标一个好看的指针特效 鼠标光标如何修改形状?
  • 如何在项目中配置.gitignore文件
  • [合集]一汽大众(斯柯达、奥迪、兰博基尼、宾利等)故障代码查询合集
  • 【论文笔记】独属于CV的注意力机制CBAM-Convolutional Block Attention Module
  • Ubuntu上安装配置(jdk/tomcat/ufw防火墙/mysql)+mysql卸载
  • ssm面向企事业单位的项目申报小程序论文源码调试讲解
  • 大数据处理从零开始————1.Hadoop介绍
  • 50ETF期权合约要素有哪些?50ETF期权合约组成构成分享
  • MFC工控项目实例之九选择下拉菜单主界面文本框显示菜单名
  • Python算法工程师面试整理-Python 在算法中的应用
  • Java基础——方法引用、单元测试、XML、注解
  • mysql集群
  • es重启后调大恢复并发参数,加速分片分配
  • 美团8/31—24年秋招【技术】第四场
  • 算法的空间复杂度
  • 【Redis】持久化——rdb机制
  • 零基础国产GD32单片机编程入门(九)低功耗模式实战含源码
  • 掌握CHECK约束:确保数据准确性的关键技巧
  • 【网络】HTTPS——HTTP的安全版本
  • GalaChain 全面剖析:为 Web3 游戏和娱乐而生的创新区块链
  • 速盾:Nginx使用CDN之后获取真实的用户IP
  • 机器学习--核心要点总结
  • k8s 存储
  • Spark自定义函数例子
  • 初识Vue.js:从零开始构建你的第一个Vue项目
  • 【C++ 第十八章】C++11 新增语法(3)
  • 工业智能物联网关,智慧医疗生态圈的创新驱动
  • 【Python机器学习】NLP词中的数学——词袋
  • 学习之MySQL约束