博客信息

迭代器模式iterator(行为模式)

发布时间:『 2019-03-30 04:37』  博客类别:23种设计模式  阅读(922)
  • 术语

    Iterator:迭代器 Aggregate :聚合

UML类图

小李飞刀_设计模式


  • 角色

    Iterator 迭代器接口:hasNext, next, remove ConcreteIterator :具体的迭代器类,管理迭代 ComputerIterator 电脑学院迭代方式 InfoIterator 信息学院迭代方式 Aggregate :统一聚合接口~学院 ConcreteAggreage:具体的聚合持有对象集合 电脑学院(ComputerCollege) 存储方式:集合 信息学院(InfoCollege) 存储方式:数组

  • 案例

    需求:遍历各个学院下的专业

    public interface College {

      public String getName();

      //增加系的方法
      public void addDepartment(String name, String desc);

      //返回一个迭代器,遍历
      public Iterator createIterator();
    }

    package com.javaxl.design.Iterator;


    import java.util.Iterator;


    public class ComputerCollege implements College {
      Department[] departments;
      int numOfDepartment = 0;// 保存当前数组的对象个数

      public ComputerCollege() {
          departments = new Department[5];
          addDepartment("Java 专业", " Java 专业 ");
          addDepartment("PHP 专业", " PHP 专业 ");
          addDepartment("大数据专业", " 大数据专业 ");
      }

      @Override
      public String getName() {
          return "计算机学院";
      }

      @Override
      public void addDepartment(String name, String desc) {
          Department department = new Department(name, desc);
          departments[numOfDepartment] = department;
          numOfDepartment += 1;
      }

      @Override
      public Iterator createIterator() {
          return new ComputerCollegeIterator(departments);
      }
    }

    package com.javaxl.design.Iterator;


    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;

    public class InfoCollege implements College {
      List<Department> departmentList;

      public InfoCollege() {
          departmentList = new ArrayList<Department>();
          addDepartment("信息安全专业", " 信息安全专业 ");
          addDepartment("网络安全专业", " 网络安全专业 ");
          addDepartment("服务器安全专业", " 服务器安全专业 ");
      }

      @Override
      public String getName() {
          return "信息工程学院";
      }

      @Override
      public void addDepartment(String name, String desc) {
          Department department = new Department(name, desc);
          departmentList.add(department);
      }

      @Override
      public Iterator createIterator() {
          return new InfoColleageIterator(departmentList);
      }
    }

    package com.javaxl.design.Iterator;

    //专业
    public class Department {
      private String name;
      private String desc;

      public Department(String name, String desc) {
          super();
          this.name = name;
          this.desc = desc;
      }

      public String getName() {
          return name;
      }

      public void setName(String name) {
          this.name = name;
      }

      public String getDesc() {
          return desc;
      }

      public void setDesc(String desc) {
          this.desc = desc;
      }
    }

    package com.javaxl.design.Iterator;

    import java.util.Iterator;


    public class ComputerCollegeIterator implements Iterator {
      //这里我们需要 Department 是以怎样的方式存放=>数组
      Department[] departments;
      int position = 0; //遍历的位置

      public ComputerCollegeIterator(Department[] departments) {
          this.departments = departments;
      }

      //判断是否还有下一个元素 @Override
      public boolean hasNext() {
          if (position >= departments.length || departments[position] == null) {
              return false;
          } else {
              return true;
          }
      }

      @Override
      public Object next() {
          Department department = departments[position];
          position += 1;
          return department;
      }

      //删除的方法,默认空实现 public void remove() {
      public void remove() {

      }
    }

    package com.javaxl.design.Iterator;


    import java.util.Iterator;
    import java.util.List;

    public class InfoColleageIterator implements Iterator {
      List<Department> departmentList; // 信息工程学院是以 List 方式存放专业
      int index = -1;//索引

      public InfoColleageIterator(List<Department> departmentList) {
          this.departmentList = departmentList;
      }

      //判断 list 中还有没有下一个元素
      @Override
      public boolean hasNext() {
          if (index >= departmentList.size() - 1) {
              return false;
          } else {
              index += 1;
              return true;
          }
      }

      @Override
      public Object next() {
          return departmentList.get(index);
      }

      // 空 实 现 remove
      public void remove() {

      }
    }

    package com.javaxl.design.Iterator;

    import java.util.Iterator;
    import java.util.List;

    public class OutPutImpl {
      //学院集合
      List<College> collegeList;

      public OutPutImpl(List<College> collegeList) {
          this.collegeList = collegeList;
      }

      //遍历所有学院,然后调用 printDepartment 输出各个学院的专业
      public void printCollege() {
          //从 collegeList 取出所有学院, Java 中的 List 已经实现 Iterator
          Iterator<College> iterator = collegeList.iterator();

          while (iterator.hasNext()) {
              //取出一个学院
              College college = iterator.next();
              System.out.println("=== " + college.getName() + "=====");
              printDepartment(college.createIterator()); //得到对应迭代器
          }
      }


    //输出 学院输出 专业
      public void printDepartment(Iterator iterator) {
          while (iterator.hasNext()) {
              Department d = (Department) iterator.next();
              System.out.println(d.getName());
          }
      }
    }

    public class Client {
      public static void main(String[] args) {
          //创建学院
          List<College> collegeList = new ArrayList<College>();
          ComputerCollege computerCollege = new ComputerCollege();
          InfoCollege infoCollege = new InfoCollege();

          collegeList.add(computerCollege);
          collegeList.add(infoCollege);

          OutPutImpl outPutImpl = new OutPutImpl(collegeList);
          outPutImpl.printCollege();
      }
    }

  • 注意事项和细节

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

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

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

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

  • 应用

    JDK源码中ArrayList类


over......


关键字:     设计模式  

备案号:湘ICP备19000029号

Copyright © 2018-2019 javaxl晓码阁 版权所有