迭代器模式

基本介绍

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

2.如果集合元素是用不同的方式实现的,当客户端要遍历这些集合元素的时,就要使用多种遍历方式,而且还会暴露元素的内部结构

 

角色

1.Iterator:迭代器接口,由JDK提供,含hasNext,next,remove

2.ConcreteIterator:具体的迭代器类,持有对应 ConcreteAggregate 的集合,获取集合的类型,遍历传入的集合

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

4.ConcreteAggregate:实现聚合接口,持有一个集合,并提供一个方法,返回对应的迭代器可以遍历持有的集合,一个 ConcreteIterator 对应 一个 ConcreteAggregate

5.Element:集合中的元素

6.Output:聚合多个 Aggregate,方便遍历每一个 ConcreteAggregate,

7.Client:客户端,依赖 Iterator 和 Aggregate

 

事项

1.优点

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

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

(3)符合单一职责原则,把管理对象集合和遍历对象集合的责任分开,集合改变时,只影响 ConcreteAggregate ,遍历方式改变时,只影响 ConcreteIterator

(4)符合开闭原则,增加新的聚合类和迭代器类时,无须修改原有代码

2.缺点

(1)每个聚合对象都要一个 ConcreteIterator,会生成多个 ConcreteIterator,不容易管理类

3.应用场景

(1)访问一个聚合对象的内容而无须暴露它的内部表示

(2)需要为聚合对象提供多种遍历方式

(3)为遍历不同的聚合结构提供一个统一的接口

 

JDK 中的 ArrayList

1.内部类 Itr 充当具体实现迭代器 Iterator 的类,作为 ArrayList 内部类

2.List 就充当了聚合接口,含有一个 Iterator 方法,返回一个迭代器对象

3.ArrayList 是实现聚合接口 List 的子类,实现了 iterator();

4.Iterator 接口由系统提供

在这里插入图片描述

 

代码示例

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

public class Client {//客户端

    public static void main(String[] args) {
        List<College> collegeList = new ArrayList<>();
        collegeList.add(new ComputerCollege());
        collegeList.add(new InfoCollege());
        Output output = new Output(collegeList);
        output.printCollege();
    }
}

interface College {//Aggregate

    String getName();

    void addDepartment(String name);

    Iterator createIterator();
}

class Department {//Element
    private String name;

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

    public String getName() {
        return name;
    }
}

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

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

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

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

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

class InfoCollege implements College {//ConcreteAggregate
    List<Department> departments;//已链表存放元素

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

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

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

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

class ComputerCollegeIterator implements Iterator {//ConcreteIterator
    Department[] departments;
    int index = 0;//遍历位置

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


    @Override
    public boolean hasNext() {
        return index <= departments.length - 1 && departments[index] != null;
    }

    @Override
    public Object next() {
        return departments[index++];
    }

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

class InfoCollegeIterator implements Iterator {//ConcreteIterator
    List<Department> departments;
    int index = 0;

    public InfoCollegeIterator(List<Department> departments) {
        this.departments = departments;
    }

    @Override
    public boolean hasNext() {
        return index <= departments.size() - 1;
    }

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

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

class Output {
    List<College> colleges;

    public Output(List<College> colleges) {
        this.colleges = colleges;
    }

    public void printCollege() {//遍历ConcreteAggregate
        Iterator<College> iterator = colleges.iterator();
        while (iterator.hasNext()) {
            College college = iterator.next();
            System.out.println("===" + college.getName() + "===");
            printDepartment(college.createIterator());
        }

    }

    public void printDepartment(Iterator iterator) {//遍历Element
        while (iterator.hasNext()) {
            Department department = (Department) iterator.next();
            System.out.println(department.getName());
        }
    }
}
posted @   半条咸鱼  阅读(19)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示