Java大数据平台开发 学习笔记(47)—— java设计模式(迭代器模式)知识汇总

一、前言:

迭代器模式的注意事项和细节:

优点:

  1. 提供一个统一的方法遍历对象,客户不用再考虑聚合的类型,使用一种方式就可以遍历对象。
  2. 隐藏了聚合的内部结构,客户端要遍历对象的时候只需要取迭代器,而不需知道聚合的具体组成。
  3. 遵循了单一职责原则,如果遍历方式改变,只影响到了迭代器。

缺点:

  1. 每个聚合对象都需要一个迭代器,会生成多个迭代器不方便管理。

二、迭代器模式:

2.1、UML 图:

在这里插入图片描述

2.2、代码实例:

Step 1) 创建 College 接口:

public interface College {
    
    
    public String getName();
    public void addDepartment(String name, String desc);
    public Iterator createInterator();
}

Step 2) 创建 ComputerCollege 实现类:

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 createInterator() {
    
    
        return new ComputerCollegeIterator(departments);
    }
}

Step 3) 创建 InfoCollege 实现类:

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

    public InfoCollege() {
    
    
        this.departmentList = new ArrayList<>();
        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 createInterator() {
    
    
        return new InfoCollegeInterator(departmentList);
    }
}

Step 4) 创建 ComputerCollegeIterator 抽象类:

public class ComputerCollegeIterator implements Iterator {
    
    

    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;
    }
}

Step 5) 创建 InfoCollegeInterator 实现类:

public class InfoCollegeInterator implements Iterator {
    
    

    List<Department> departmentList;
    int index = -1;

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

    @Override
    public boolean hasNext() {
    
    
        if(index >= departmentList.size() -1){
    
    
            return false;
        }else {
    
    
            index += 1;
            return true;
        }
    }

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


Step 6) 创建 Department 类:

public class Department {
    
    
    private String name;
    private String desc;

    public Department(String name, String desc) {
    
    
        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;
    }
}

Step 7) 创建 OutPutImpl 类:

public class OutPutImpl {
    
    
    List<College> collegeList;

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

    public void printCollege(){
    
    
        Iterator<College> iterator = collegeList.iterator();
        while (iterator.hasNext()){
    
    
            College college = iterator.next();
            System.out.println("==="+college.getName()+"===");
            pringtDepartment(college.createInterator());
        }
    }

    public void pringtDepartment(Iterator iterator){
    
    
        while (iterator.hasNext()){
    
    
            Department d = (Department) iterator.next();
            System.out.println(d.getName());
        }
    }
}

Step 8) 创建 main 方法:

public class Client {
    
    
    public static void main(String[] args) {
    
    
        ArrayList<College> collegeArrayList = new ArrayList<>();

        ComputerCollege computerCollege = new ComputerCollege();
        InfoCollege infoCollege = new InfoCollege();

        collegeArrayList.add(computerCollege);
        collegeArrayList.add(infoCollege);

        OutPutImpl outPut = new OutPutImpl(collegeArrayList);
        outPut.printCollege();

    }
}


• 由 ChiKong_Tam 写于 2020 年 10 月 21 日