• 设计模式-迭代器模式


    目录

    一:基本介绍

    二:原理说明

    三:案例说明

    四:优点

    五:缺点


    一:基本介绍

    1)属于行为模式

    2)如果我们的集合元素是用不同的方式实现的,有数组,还有java的集合类,或者还有其他方式,当客户 端要遍历这些集合元素的时候就要使用多种遍历方式,而且还会暴露元素的内部结构,可以考虑迭代器模式解决

    3)迭代器模式,提供一种遍历集合元素的统一接口,用一致的方法遍历集合元素,不需要知道集合对象的底层表示,即:不暴露其内部结构

    二:原理说明

    1)Iterator:迭代器接口,是系统提供,含有hasNext, next, remove

    2)ConcreteIterator:具体的迭代器类,管理迭代

    3)Aggregate:一个统一的聚合接口,将客户端和具体的聚合解耦

    4)ConcreateAggreage:具体的聚合,持有对象集合

    5)ClientL:客户端,通过Iterator和Aggregate依赖子类

    三:案例说明

    1. // 系
    2. @Data
    3. @AllArgsConstructor
    4. @NoArgsConstructor
    5. public class Department {
    6. private String name;
    7. private String desc;
    8. }
    1. public class ComputerCollegeIterator implements Iterator {
    2. // 这里我们需要知道Department是以怎样的方式存放 ==>数组
    3. Department[] departments;
    4. // 遍历的位置
    5. int position = 0;
    6. public ComputerCollegeIterator(Department[] departments) {
    7. this.departments = departments;
    8. }
    9. // 判断是否还有下一个
    10. @Override
    11. public boolean hasNext() {
    12. if (position >= departments.length || departments[position] == null) {
    13. return false;
    14. } else {
    15. return true;
    16. }
    17. }
    18. @Override
    19. public Object next() {
    20. Department department = departments[position];
    21. position +=1;
    22. return department;
    23. }
    24. // 删除的方法默认空实现
    25. public void remove() {
    26. }
    27. }
    1. public class InfoColleageIterator implements Iterator {
    2. List departmentList;// 信息工程学院是以list的方式存放系
    3. int index = -1;// 索引
    4. public InfoColleageIterator(List departmentList) {
    5. this.departmentList = departmentList;
    6. }
    7. // 判断list中还有没有下一个元素
    8. @Override
    9. public boolean hasNext() {
    10. if (index >= departmentList.size() - 1) {
    11. return false;
    12. } else {
    13. index += 1;
    14. return true;
    15. }
    16. }
    17. @Override
    18. public Object next() {
    19. return departmentList.get(index);
    20. }
    21. // 空实现remove
    22. public void remove() {
    23. }
    24. }
    1. public class ComputerCollege implements College {
    2. Department[] departments;
    3. int numOfDepartments = 0;// 保存当前数组的个数
    4. public ComputerCollege() {
    5. departments = new Department[5];
    6. addDepartment("java", "java");
    7. addDepartment("php", "php");
    8. addDepartment("大数据", "大数据");
    9. }
    10. @Override
    11. public String getName() {
    12. return "计算机学院";
    13. }
    14. @Override
    15. public void addDepartment(String name, String desc) {
    16. Department department = new Department(name, desc);
    17. departments[numOfDepartments] = department;
    18. numOfDepartments++;
    19. }
    20. @Override
    21. public Iterator createIterator() {
    22. return new ComputerCollegeIterator(departments);
    23. }
    24. }
    1. public class InfoCollege implements College{
    2. List departmentList;
    3. public InfoCollege() {
    4. departmentList = new ArrayList();
    5. addDepartment("信息安全专业", "信息安全专业");
    6. addDepartment("网络安全专业", "网络安全专业");
    7. addDepartment("服务器安全专业", "服务器安全专业");
    8. }
    9. @Override
    10. public String getName() {
    11. return "信息工程学院";
    12. }
    13. @Override
    14. public void addDepartment(String name, String desc) {
    15. Department department = new Department(name, desc);
    16. departmentList.add(department);
    17. }
    18. @Override
    19. public Iterator createIterator() {
    20. return new InfoColleageIterator(departmentList);
    21. }
    22. }
    1. public interface College {
    2. public String getName();
    3. // 增加系的方法
    4. public void addDepartment(String name, String desc);
    5. // 返回一个迭代器遍历
    6. public Iterator createIterator();
    7. }
    1. public class OutPutImpl {
    2. // 学院集合
    3. List collegeList;
    4. public OutPutImpl(List collegeList) {
    5. this.collegeList = collegeList;
    6. }
    7. // 遍历所有的学院,然后调用printDepartment 输出各个学院的系
    8. public void printCollege() {
    9. // 从collegeList取出所有学院
    10. Iterator iterator = collegeList.iterator();
    11. while (iterator.hasNext()) {
    12. // 取出一个学院
    13. College college = iterator.next();
    14. System.out.println("College: " + college.getName());
    15. printDepartment(college.createIterator());
    16. }
    17. }
    18. // 学院输出系
    19. public void printDepartment(Iterator iterator) {
    20. while (iterator.hasNext()) {
    21. Department department = (Department) iterator.next();
    22. System.out.println(department.getName());
    23. }
    24. }
    25. }
    1. public class Client {
    2. public static void main(String[] args) {
    3. // 创建学院
    4. ArrayList colleges = new ArrayList<>();
    5. ComputerCollege computerCollege = new ComputerCollege();
    6. InfoCollege infoCollege = new InfoCollege();
    7. colleges.add(computerCollege);
    8. colleges.add(infoCollege);
    9. OutPutImpl outPut = new OutPutImpl(colleges);
    10. outPut.printCollege();
    11. }
    12. }

    四:优点

    1)提供了统一的遍历方法,客户不用再考虑聚合的类型,使用一种方法就可以遍历对象了

    2)隐藏了聚合的内部结构,客户端要遍历聚合的时候,只能取到迭代器,而不会周到聚合的具体组成

    3)当要展示一组相似对象,或者遍历一组相同对象时使用,适合使用迭代器模式

    五:缺点

    每个聚合对象都要有一个迭代器,会生成许多迭代器不好管理类

  • 相关阅读:
    软考(高级)是否需要报班,大家有什么建议?
    Linux配置java,maven,marshalsec环境
    中小型企网搭建
    Python学习基础笔记十四——函数参数
    HTTP 面试知识点提炼
    六月集训(27) 图
    ubuntu python serial实现串口数据收发
    python 线程池与队列简单应用
    唯一性索引与逻辑删除冲突问题解决思路
    电脑怎么截图,4种简单常用的截图方法
  • 原文地址:https://blog.csdn.net/weixin_55157621/article/details/139639652