设计模式--第15篇(迭代器模式)

一,迭代器模式

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

二,原理类图

在这里插入图片描述
意图: 提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。
适用性:
一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。访问一个聚合对象的内容而无需暴露它的内部表示。支持对聚合对象的多种遍历。为遍历不同的聚合结构提供一个统一的接口(即, 支持多态迭代)。

三,实例

Iterator: 迭代器接口,jdk提供;

package java.util;
import java.util.function.Consumer;

public interface Iterator<E> {
    boolean hasNext();
    E next();
    default void remove() {
        throw new UnsupportedOperationException("remove");
    }
    default void forEachRemaining(Consumer<? super E> action) {
        Objects.requireNonNull(action);
        while (hasNext())
            action.accept(next());
    }
}

ConcreteIterator: 具体的迭代器,管理迭代;

package com.neei.iterator;

import java.util.Iterator;

/**
 * @param
 * @Author: AaNeei
 * @Date: 2019/10/14  21:21
 * @Description: 游学网
 * @throws:
 */
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;
        }
        return true;
    }

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

    @Override
    public void remove() {

    }
}


public class InfoCollegeIterator implements Iterator {
    //信息学院以集合方式存放
    List<Department> departments;
    int index = -1;

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

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

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

    @Override
    public void remove() {

    }
}

Aggregate: 一个统一的聚合接口,将客户端与具体聚合解耦;

package com.neei.iterator;

import java.util.Iterator;

/**
 * @param
 * @Author: AaNeei
 * @Date: 2019/10/14  21:29
 * @Description: 游学网
 * @throws:
 */
public interface College {

    String getName();

    void addDepartment(String name, String desc);

    Iterator createIterator();
}

ConcreteAggregate: 具体的聚合持有的集合对象,提供方法返回适合的迭代器;

package com.neei.iterator;

import java.util.Iterator;

/**
 * @param
 * @Author: AaNeei
 * @Date: 2019/10/14  21:31
 * @Description: 游学网
 * @throws:
 */
public class ComputerCollege implements College {
    Department[] departments;
    private int num = 0;

    public ComputerCollege() {
        this.departments = new Department[5];
        addDepartment("java", "java");
        addDepartment("BigData", "BigData");
        addDepartment("python", "python");
        addDepartment("C", "C");
        addDepartment("C#", "C#");
    }

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

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

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


public class InfoCollege implements College {

    private List<Department> departments ;

    public InfoCollege() {
        this.departments = new ArrayList<>(5);
        addDepartment("通信工程","通信工程");
        addDepartment("信息安全","信息安全");
    }

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

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

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

client:

package com.neei.iterator;

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

/**
 * @param
 * @Author: AaNeei
 * @Date: 2019/10/14  21:40
 * @Description: 游学网
 * @throws:
 */
public class OutPut {
    List<College> colleges;

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

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

    private void printDepartment(Iterator iterator) {
        while (iterator.hasNext()) {
            Department department = (Department) iterator.next();
            System.out.println(department.getName() + ":" + department.getDesc());
        }

    }
}


public class Client {
    public static void main(String[] args) {
        List<College> colleges = new ArrayList<>(5);
        colleges.add(new ComputerCollege());
        colleges.add(new InfoCollege());
        OutPut outPut = new OutPut(colleges);
        outPut.printCollege();
    }
}

四,源码分析

JDK源码中使用的迭代器模式,如java.util.List#iterator

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值