首页 > 其他分享 >迭代器模式

迭代器模式

时间:2022-12-09 14:55:51浏览次数:40  
标签:Iterator 迭代 departments 模式 Department new iterator public

需求案例

使用传统的设计方案

传统解决方案存在的问题

迭代器模式的基本介绍

迭代器模式的原理类图

 

 

 

迭代器模式应用实例

 

 

 

代码实现

package com.sky.iterator;

import java.util.Iterator;

// 学院接口
public interface College {

    // 获取学院的名字
    String getCollegeName();

    // 添加院系
    void addDepartment(Department department);

    // 获取迭代器
    Iterator getIterator();

}
package com.sky.iterator;

import java.util.Iterator;

// 学院的实现类
public class ComputerCollege implements College {

    private Department[] departments;

    private int num = 0; // 记录数组的对象数

    public ComputerCollege(){
        departments = new Department[4];
        departments[0] = new Department("计算机科学与技术","计算机科学与技术描述");
        departments[1] = new Department("软件工程","软件工程描述");
        departments[2] = new Department("网络工程","网络工程描述");
        departments[3] = new Department("大数据","大数据描述");

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

    @Override
    public void addDepartment(Department department) {
        departments[num++] = department;
    }

    @Override
    public Iterator getIterator() {
        return new ComputerIterator(departments);
    }
}
package com.sky.iterator;

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

public class InfoManagerCollege implements College {

    private List<Department> list;

    public InfoManagerCollege(){
        list = new ArrayList<>();
        list.add(new Department("信息分析","信息分析描述"));
        list.add(new Department("信息统计","信息统计描述"));
        list.add(new Department("信息抽取","信息抽取描述"));
    }

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

    @Override
    public void addDepartment(Department department) {

        list.add(department);

    }

    @Override
    public Iterator getIterator() {
        return new InfoManagerIterator(list);
    }
}
package com.sky.iterator;

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;
    }
}
package com.sky.iterator;

import java.util.Iterator;

/**
 * 计算机学院 的 迭代器
 */
public class ComputerIterator implements Iterator {

    private Department[] departments; // 假设计算机学院中的系是以数组的形式保存的

    private int index; // 下标 遍历的时候用到

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


    // 判断遍历的时候,是否还存在元素
    @Override
    public boolean hasNext() {
        if(index >= departments.length || departments[index] == null){
            return false;
        }
        return true;
    }

    // 获取下一个元素
    @Override
    public Object next() {

        return departments[index++];
    }

    // 移除元素
    @Override
    public void remove() {
        // 空实现
    }
}
package com.sky.iterator;

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

/**
 * 信息管理学院
 */
public class InfoManagerIterator implements Iterator {

    private List<Department> departmentList = new ArrayList<>(); // 假设信息管理学院中的系是以List集合的方式存储的

    private int position; // 下标 遍历的时候用到

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

    // 判断遍历的时候,是否还存在元素
    @Override
    public boolean hasNext() {

        if(position > departmentList.size()-1 || departmentList.get(position) == null){
            return false;
        }

        return true;
    }

    // 获取下一个元素
    @Override
    public Object next() {
        return departmentList.get(position++);
    }

    // 移除元素
    @Override
    public void remove() {
        // 空实现
    }
}
package com.sky.iterator;

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

// 打印学院院系
public class OutputCollegeImpl {

    private List<College> collegeList;

    public OutputCollegeImpl() {
        collegeList = new ArrayList<>();
        collegeList.add(new ComputerCollege());
        collegeList.add(new InfoManagerCollege());
    }

    // 打印学院以及下面的院系
    public void getCollegeAllDepartment() {
        Iterator<College> iterator = collegeList.iterator();
        while (iterator.hasNext()) {
            // 获取到学院
            College college = iterator.next();
            System.out.println("==========" + college.getCollegeName() + "=========");

            // 获取学院的迭代器
            // 计算机学院用的数组存储,信息管理学院用的列表存储,通过迭代器可统一使用
            Iterator collegeIterator = college.getIterator();
            while (collegeIterator.hasNext()){
                // 获取到院系
                Department department = (Department) collegeIterator.next();
                System.out.println(department.getName() + ":" + department.getDesc());
            }

        }
    }

}
package com.sky.iterator;

// 客户端
public class Client {

    public static void main(String[] args) {
        OutputCollegeImpl outputCollege = new OutputCollegeImpl();
        outputCollege.getCollegeAllDepartment();
    }
}

==========计算机学院=========
计算机科学与技术:计算机科学与技术描述
软件工程:软件工程描述
网络工程:网络工程描述
大数据:大数据描述
==========信息工程学院=========
信息分析:信息分析描述
信息统计:信息统计描述
信息抽取:信息抽取描述

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

 

标签:Iterator,迭代,departments,模式,Department,new,iterator,public
From: https://www.cnblogs.com/dongyaotou/p/16968928.html

相关文章

  • stm32f407VET6 同一组IO的不同io口设置不同的模式(GPIOA 或 GPIOB 或 GPIOC、等)
    1、使能这组GPIO外设的时钟2、定义GPIO口初始化结构体(不同模式的io口,设置不同的结构体),设置Pin_x的模式 ......
  • Redis主从复制,哨兵模式和集群模式
    一、主从复制1.1主从复制-哨兵-集群主从复制:主从复制是高可用Redis的基础,哨兵和集群都是在主从复制基础上实现高可用的。主从复制主要实现了数据的多机备份,以及对于读操......
  • TIMx_ETR外部时钟源模式2配置方法
    由于stm32中的时钟源对应的GPIO口都是ST原厂已经分配好的,可以查看数据手册了解,所以我们要将外部触发信号连接到对应的时钟源GPIOpin口,这样才能起到外部时钟源的作用。例......
  • Web应用模式
    (1)Web应用模式在Web开发中,有两种模式:前后端分离#前后端分离:只专注于后端,返回json格式数据前后端不分离#前后端混合开发(前后端不分离)返回的是HTML的......
  • 三种过渡到IPv6的隧道模式
    隧道模式直接利用现有IPv4网络实现与IPv6网络的通信。1、6PE在核心网络是IPv4网络的情况下,如果要构建一个IPv6网络,可以通过在支持IPv6协议的边界路由器之间建立IPv6隧道,由这......
  • 设计满足开闭原则的策略模式
    开闭原则是说不修改原有代码的基础上,对于新增加的功能采用实现接口的方法即可实现策略模式将对象的行为抽象为一个通用的方法,不同的对象实现同一个方法进行重写,可以减少复......
  • Redis的三种模式
    一、主从复制1.1主从复制的概念主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(Master),后者称为从节点(Slave);数据的复制是单向的,只......
  • Redis 主从复制、哨兵模式、Cluster集群
    一、Redis主从复制1.1、什么是主从复制如图:将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave),数据的复制是单向的,只能由......
  • 设计模式及设计规则详解(1)
    设计模式什么是设计模式?是在系统设计中针对场景的一种方案,是解决功能逻辑开发的一种共性问题。设计模式学习的是什么?学习的是设计模式的思想,不能直接进行硬套设计原则......
  • vs2017中解决“调试模式下无法修改代码”的问题
    …不是在启用“编辑并继续”的情况下编译的。请确保使用程序数据库的“编辑并继续(/ZI)”选项编译此文件。相信在编程中你也会遇到这种问题,不要慌,这篇博客将帮你彻底解决......