• 设计模式之迭代器模式(十三)


    目录

    1. 背景

    1.1 学院展示问题

    1.2 迭代器模式概述

    2. 迭代器模式

    2.1 迭代器解决院校展示

    2.2 迭代器模式在JDK ArrayList中的应用


    1. 背景

    1.1 学院展示问题

    编写程序展示一个学校院系结构:需求是这样,要在一个页面中展示出学校的院系
    组成,一个学校有多个学院,一个学院有多个系。

    之前在组合模式中就是用到这个例子,因为可以用树形来展示,可以用组合模式来解决问题。

    也可以用迭代器模式

    1.2 迭代器模式概述

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

    说明:

    • Iterator :迭代器接口,是系统提供,含有 hasNext, next, remove
    • Concretelterator:具体的迭代器类,管理迭代
    • Aggregate :一个统一的聚合接口,将客户端和具体聚合解耦
    • ConcretcAggreage:具体的聚合持有对象集合,并提供一个方法,返回一个迭代器,该迭代器可以正确遍历集合。

    优点:

    • 迭代模式提供了一个统一的方法遍历对象,不用考虑聚合类型,统一方法遍历对象。
    • 提供了一种设计思想:单一职责原则,引起一个类变化的原因只有一个。在聚合类中,把管理对象的遍历对象分开,这样一来集合改变,只改变聚合类型,遍历方式改变,只影响迭代器。

    2. 迭代器模式

    2.1 迭代器解决院校展示

    1. public class Department {
    2. private String name;
    3. private String desc;
    4. public Department(String name, String desc) {
    5. super();
    6. this.name = name;
    7. this.desc = desc;
    8. }
    9. public String getName() {
    10. return name;
    11. }
    12. public void setName(String name) {
    13. this.name = name;
    14. }
    15. public String getDesc() {
    16. return desc;
    17. }
    18. public void setDesc(String desc) {
    19. this.desc = desc;
    20. }
    21. }
    1. public class ComputerCollegeIterator implements Iterator {
    2. //这里我们需要Department 是以怎样的方式存放=>数组
    3. Department[] departments;
    4. int position = 0; //遍历的位置
    5. public ComputerCollegeIterator(Department[] departments) {
    6. this.departments = departments;
    7. }
    8. //判断是否还有下一个元素
    9. @Override
    10. public boolean hasNext() {
    11. // TODO Auto-generated method stub
    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. // TODO Auto-generated method stub
    21. Department department = departments[position];
    22. position += 1;
    23. return department;
    24. //删除的方法,默认空实现
    25. public void remove() {
    26. }
    27. }
    1. public interface College {
    2. public String getName();
    3. //增加系的方法
    4. public void addDepartment(String name, String desc);
    5. //返回一个迭代器,遍历
    6. public Iterator createIterator();
    7. }
    8. public class ComputerCollege implements College {
    9. Department[] departments;
    10. int numOfDepartment = 0 ;// 保存当前数组的对象个数
    11. public ComputerCollege() {
    12. departments = new Department[5];
    13. addDepartment("Java专业", " Java专业 ");
    14. addDepartment("PHP专业", " PHP专业 ");
    15. addDepartment("大数据专业", " 大数据专业 ");
    16. }
    17. @Override
    18. public String getName() {
    19. return "计算机学院";
    20. }
    21. @Override
    22. public void addDepartment(String name, String desc) {
    23. Department department = new Department(name, desc);
    24. departments[numOfDepartment] = department;
    25. numOfDepartment += 1;
    26. }
    27. @Override
    28. public Iterator createIterator() {
    29. return new ComputerCollegeIterator(departments);
    30. }
    31. }
    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 取出所有学院, Java 中的 List 已经实现Iterator
    10. Iterator iterator = collegeList.iterator();
    11. while(iterator.hasNext()) {
    12. //取出一个学院
    13. College college = iterator.next();
    14. System.out.println("=== "+college.getName() +"=====" );
    15. printDepartment(college.createIterator()); //得到对应迭代器
    16. }
    17. }
    18. //输出 学院输出 系
    19. public void printDepartment(Iterator iterator) {
    20. while(iterator.hasNext()) {
    21. Department d = (Department)iterator.next();
    22. System.out.println(d.getName());
    23. }
    24. }
    25. }
    1. public class Client {
    2. public static void main(String[] args) {
    3. // TODO Auto-generated method stub
    4. //创建学院
    5. List collegeList = new ArrayList();
    6. ComputerCollege computerCollege = new ComputerCollege();
    7. InfoCollege infoCollege = new InfoCollege();
    8. collegeList.add(computerCollege);
    9. //collegeList.add(infoCollege);
    10. OutPutImpl outPutImpl = new OutPutImpl(collegeList);
    11. outPutImpl.printCollege();
    12. }
    13. }

    2.2 迭代器模式在JDK ArrayList中的应用

    • 内部类ltr充当具体实现迭代器Iterator的类,作为ArrayList内部类
    • List就是充当了聚合接口,含有一个 iterator()方法,返回一个迭代器对象ArrayList是实现聚合接口List 的子类,实现了iterator()
    • lterator接口系统提供
    • 迭代器模式解决了不同集合(ArrayList ,LinkedList)统一遍历问题
       
  • 相关阅读:
    第8章 使用注解的方式整合MyBatis 入门详解
    常见的自动化工具、Ansible安装
    MATLAB——径向基神经网络预测程序
    Python基础学习016__UnitTest
    【UniApp】-uni-app-内置组件
    第11章 初识SqlSugarCore之NPOI Excel导入
    Android多线程和线程池
    聚观早报 | OPPO公布全新AI战略;华为P70 Art影像细节曝光
    定时任务动态管理-Scheduled
    华为云服务器内网vpc对等连接及微服务内网集群搭建处理
  • 原文地址:https://blog.csdn.net/weixin_45734473/article/details/128093865