【行为型】迭代器模式

news/2025/2/13 15:59:50/

代码

package com.fly.patterns.iterator;/*** @author fei.chen* @projectName design-patterns* @description: 只声明一个方法,为了建立一个可对应聚合的Iterator* @date 2023/5/29下午 4:08*/
public interface Aggregate {/*** 在进行递增、遍历或者检查某个聚合时,利用 iterator 方法即可建立一个实现 Iterator 接口的类对象实例* @return*/abstract Iterator iterator();
}
package com.fly.patterns.iterator;/*** @author fei.chen* @projectName design-patterns* @description: 执行元素递增* @date 2023/5/29下午 4:09*/
public interface Iterator {/*** 检查是否有下一元素* boolean 是结束与继续的条件* @return*/abstract boolean hasNext();/*** 取得 下一元素* @return*/abstract Object next();
}
 package com.fly.patterns.iterator;/*** @author fei.chen* @projectName design-patterns* @description: 书籍类* @date 2023/5/29下午 4:09*/
public class Book {private String name = "";public Book(String name) {this.name = name;}public String getName() {return name;}
}
package com.fly.patterns.iterator;import java.util.Vector;/*** @author fei.chen* @projectName design-patterns* @description: 书架作用类; 要实现 Aggregate 接口 才能把本类当做聚合来处理。* @date 2023/5/29下午 4:39*/
public class BookShelf implements Aggregate {
//    // book 数组;大小要在开始时就设定; 注意:这是私有参数 不能被其他类修改。
//    private Book[] books;
//    private int last = 0;
//
//    public BookShelf(int maxsize){
//        this.books = new Book[maxsize];
//    }
//
//    public Book getBookAt(int index){
//        return books[index];
//    }
//
//    public void appendBook(Book book){
//        this.books[last] = book;
//        last++;
//    }
//
//    public int getLength(){
//        return last;
//    }
//
//    @Override
//    public Iterator iterator() {
//        return new BookShelfIterator(this);
//    }// book 数组;大小要在开始时就设定; 注意:这是私有参数 不能被其他类修改。private Vector<Book> books;private int last = 0;public BookShelf(int maxsize){this.books = new Vector<>(maxsize);}public Book getBookAt(int index){return books.get(index);}public void appendBook(Book book){books.add(last,book);last++;}public int getLength(){return last;}@Overridepublic Iterator iterator() {return new BookShelfIterator(this);}
}
package com.fly.patterns.iterator;/*** @author fei.chen* @projectName design-patterns* @description: 扫描 BookShelf类的类* @date 2023/5/29下午 4:44*/
public class BookShelfIterator implements Iterator {/**  要扫描的书架  */private BookShelf bookShelf;/**  书架的下标  */private int index;public BookShelfIterator(BookShelf bookShelf) {this.bookShelf = bookShelf;this.index = 0;}@Overridepublic boolean hasNext() {if (index < bookShelf.getLength()) {return true;} else {return false;}}@Overridepublic Object next() {Book book = bookShelf.getBookAt(index);index++;return book;}
}
package com.fly.patterns.iterator;/*** @author fei.chen* @projectName design-patterns* @description: 测试类* @date 2023/5/29下午 4:49*/
public class Main {public static void main(String[] args) {BookShelf bookShelf = new BookShelf(4);bookShelf.appendBook(new Book("第1本书 《我的世界》"));bookShelf.appendBook(new Book("第2本书 《世界简史》"));bookShelf.appendBook(new Book("第3本书 《人类监视》"));bookShelf.appendBook(new Book("第4本书 《动物世界》"));Iterator iterator = bookShelf.iterator();while (iterator.hasNext()){Book book = (Book)iterator.next();System.out.println(book.getName());}}
}

迭代器模式

这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。 迭代器模式属于行为型模式。它允许您以一种更灵活、可扩展的方式遍历集合对象。这种模式通过提供一个迭代器(Iterator)来遍历集合对象,而不是直接访问集合中的元素。迭代器模式有助于降低代码的耦合度,并使代码更易于维护和扩展。

  • Aggregate(聚合) 已聚合的接口
  • ConcreteIterator(具体集合)
  • Iterator(迭代器) 执行递增、遍历的接口
  • BookShelfIterator(具体的迭代器) 扫描书架的类
  • Book 书籍类
  • BookShelf 书架类
  • Main 测试类

这里面其实只用到了iterator的 hasNext next 两个方法,不会受到具体BookShelf类的影响,
目前是用数组实现管理书籍,假如之后想改用其他集合比如List或者Vector,无论怎么修改,只要能反正
正确的 iterator 就好。下面代码一点也不需要改动。

while (iterator.hasNext()){Book book = (Book)iterator.next();System.out.println(book.getName());
}

使用场景:

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

注意事项:

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

总结

设计迭代器模式的目的就是提高类的复用率,就是把类当做一个零部件使用,只要修改某一个零部件,就不需要在费力的去修改其他的零部件。

所以我们在设定程序的时候不把方法 iterator 的返回值 写死 成 BookShelfIterator 类的变量,
而是指定到 Iterator 里面,我们不是要利用BookShelfIterator 去实现程序,而是利用 Iterator 的方法来实现程序。


http://www.ppmy.cn/news/103449.html

相关文章

CASA模型NPP及碳源、碳汇模拟

CASA模型 CASA模型是一个基于过程的遥感模型(Potteret al&#xff0c;1993&#xff1b;Potter et al&#xff0c;1994)&#xff0c;耦合了生态系统生产力和土壤碳、氮通量&#xff0c;由网格化的全球气候、辐射、土壤和遥感植被指数数据集驱动。模型包括土壤有机物、微量气体通…

mpi4py和pytorch求解含参优化控制问题-几何参数

含参优化控制问题数学模型 下面三行代码分别表示: 代码运行,–para 2表示选择第二种并行策略 查看运行情况 杀死命令 nohup mpiexec -n 8 python hpann.py --para 2 >> hmpi.log 2>&1 & ps -ef | grep python ps -ef | grep python | awk {print $2} |

MyBatis参数传递(提供ParamNameResolver类来进行参数封装)源码分析

MyBatis接口方法中可以接收各种各样的参数&#xff0c;MyBatis底层对于这些参数进行不同的封装处理方式。 单个参数&#xff1a;实体类、Map集合、Collection、List、Array以及其他类型。 多个参数&#xff1a;Param注解定义的名称要与sql语句中参数占位符中的名称相同。 这里…

detectron2 使用教程

本范例演示使用非常有名的目标检测框架detectron2 🤗🤗 在自己的数据集(balloon数据)上训练实例分割模型MaskRCNN的方法。 detectron2框架的设计有以下一些优点: 1,强大:提供了包括目标检测、实例分割、全景分割等非常广泛的视觉任务模型库。 2,灵活:可以通过注册机…

JavaScript中常用的正则表达式运算符

前言&#xff1a;正则表达式是一种非常好用的工具&#xff0c;帮助开发人员在开发时&#xff0c;处理字符串时更加高效和灵活&#xff1b;它最大的用处就是在字符串操作中&#xff0c;可以让开发人员快速的字符串匹配、搜索、替换、验证和提取等操作。 文章目录&#xff1a; ^…

3d虚拟主播形象能提升提升企业销售额

随着科技的不断进步和发展&#xff0c;虚拟人形象正在被广泛地应用于商业宣传中。3D虚拟人形象是指采用计算机图形学、人工智能等技术&#xff0c;模拟真实人类形象的虚拟形象。相比于传统产品营销方式&#xff0c;采用3D虚拟人形象进行产品交互讲解对提升企业销售额具有很多优…

RocketMQ实现一个简单的秒杀接口

预设场景&#xff1a; “秒杀”这一词多半出现在购物方面&#xff0c;但是又不单单只是购物&#xff0c;比如12306购票和学校抢课&#xff08;大学生的痛苦&#xff09;也可以看成一个秒杀。秒杀应该是一个“三高”&#xff0c;这个三高不是指高血脂&#xff0c;高血压和高血糖…

js中将字符串[user[name=jjdf,age=1],user[name=ggdf,age=5]]转为json串对象

js中将字符串转为json串对象 var str "[user[namejjdf,age1],user[nameggdf,age5]]"; string2json(str); function string2json(str){str str.substring(1,str.length-1);str str.replaceAll(/\user/g,)str str.replaceAll("","\":\"&q…