栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > .Net

设计模式 行为型模式 实例 -- 迭代器模式实例:迭代数组

.Net 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

设计模式 行为型模式 实例 -- 迭代器模式实例:迭代数组

01:设计模式 行为型模式 – 迭代器模式(定义、结构、实例、优缺点分析)
02:迭代器模式实例
03:设计模式 行为型模式 – 迭代器模式 JDK源码解析:ArrayList

1. 迭代器模式实例
1.1 需求分析
一个数组中存在Student和Teacher两种对象,
现有两种访问需求:
一个是访问所有学生,一个是访问所有人员,
请用迭代器模式实现两种访问,并打印出人员的基本信息.

1.2 类图分析

类图分析:


1.3 代码实现
1.3.1 People、Student、Teacher

People:

package ex08.iterator.role;


public class People {
}

Student:

package ex08.iterator.role;


public class Student extends People {
    private String stuName;
    private String stuNo;


    public String getStuName() {
        return stuName;
    }

    public void setStuName(String stuName) {
        this.stuName = stuName;
    }

    public String getStuNo() {
        return stuNo;
    }

    public void setStuNo(String stuNo) {
        this.stuNo = stuNo;
    }

    public Student(String stuName, String stuNo) {
        this.stuName = stuName;
        this.stuNo = stuNo;
    }

    @Override
    public String toString() {
        return "Student{" +
                "stuName='" + stuName + ''' +
                ", stuNo='" + stuNo + ''' +
                '}';
    }
}

Teacher:

package ex08.iterator.role;


public class Teacher extends People {
    private String teaName;
    private String teaNo;

    public String getTeaName() {
        return teaName;
    }

    public void setTeaName(String teaName) {
        this.teaName = teaName;
    }

    public String getTeaNo() {
        return teaNo;
    }

    public void setTeaNo(String teaNo) {
        this.teaNo = teaNo;
    }

    public Teacher(String teaName, String teaNo) {
        this.teaName = teaName;
        this.teaNo = teaNo;
    }

    @Override
    public String toString() {
        return "Teacher{" +
                "teaName='" + teaName + ''' +
                ", teaNo='" + teaNo + ''' +
                '}';
    }
}

1.3.2 PeopleAggregate : 抽象聚合角色
package ex08.iterator;

import ex08.iterator.role.People;


public interface PeopleAggregate {

    //添加功能
    void addPeople(People people);

    //删除功能
    void removePeople(People people);

    //获取迭代器对象功能
    PeopleIterator getPeopleIterator();

    //获取迭代器对象功能
    PeopleIterator getStuIterator();
}

1.3.3 PeopleAggregateImpl:具体聚合角色
package ex08.iterator;

import ex08.iterator.role.People;

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


public class PeopleAggregateImpl implements PeopleAggregate {
    List peopleList = new ArrayList<>();

    @Override
    public void addPeople(People people) {
        peopleList.add(people);
    }

    @Override
    public void removePeople(People people) {
        peopleList.remove(people);
    }

    @Override
    public PeopleIterator getPeopleIterator() {
        return new PeopleIteratorImpl(peopleList);
    }

    @Override
    public PeopleIterator getStuIterator() {
        return new StudentIteratorImpl(peopleList);
    }
}

1.3.4 PeopleIterator:抽象迭代器角色
package ex08.iterator;

import ex08.iterator.role.People;


public interface PeopleIterator {
    //判断是否还有元素
    boolean hasNext();

    //获取下一个元素
    People next();
}

1.3.5 PeopleIteratorImpl、StudentIteratorImpl :具体迭代器角色

PeopleIteratorImpl:

package ex08.iterator;

import ex08.iterator.role.People;

import java.util.List;


public class PeopleIteratorImpl implements PeopleIterator {
    private final List peopleList;
    private int position = 0;//用来记录遍历时的位置
    
    public PeopleIteratorImpl(List peopleList) {
        this.peopleList = peopleList;
    }

    @Override
    public boolean hasNext() {
        return position < peopleList.size();
    }

    @Override
    public People next() {
        //从集合中获取指定位置的元素
        return peopleList.get(position++);
    }
}

StudentIteratorImpl :

package ex08.iterator;

import ex08.iterator.role.People;
import ex08.iterator.role.Student;

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


public class StudentIteratorImpl implements PeopleIterator {
    List studentList = new ArrayList<>();
    private int stuPosition = 0;//用来记录学生遍历时的位置

    public StudentIteratorImpl(List peopleList) {
        for (People people : peopleList) {
            if (people instanceof Student) {
                studentList.add(people);
            }
        }
    }

    @Override
    public boolean hasNext() {
        return stuPosition < studentList.size();
    }

    @Override
    public People next() {
        //从集合中获取指定位置的元素
        return studentList.get(stuPosition++);
    }
}

1.3.6 Client :客户端类
package ex08.iterator;

import ex08.iterator.role.People;
import ex08.iterator.role.Student;
import ex08.iterator.role.Teacher;


public class Client {
    public static void main(String[] args) {
        // 创建具体聚合类
        PeopleAggregateImpl peopleAggregate = new PeopleAggregateImpl();
        // 添加数据
        addData(peopleAggregate);

        //遍历聚合对象
        //1.获取迭代器对象
        PeopleIterator peopleIterator = peopleAggregate.getPeopleIterator();
        while (peopleIterator.hasNext()) {
            //3,获取元素
            People people = peopleIterator.next();
            System.out.println(people.toString());
        }

        System.out.println("---------------------------------");
        PeopleIterator stuIterator = peopleAggregate.getStuIterator();
        while (stuIterator.hasNext()) {
            Student student = (Student) stuIterator.next();
            System.out.println(student.toString());
        }
    }

    public static void addData(PeopleAggregateImpl peopleAggregate) {
        // 添加学生
        peopleAggregate.addPeople(new Student("学生1", "11923020124"));
        peopleAggregate.addPeople(new Student("学生2", "11923020123"));
        peopleAggregate.addPeople(new Student("学生3", "11923020123"));
        // 添加老师
        peopleAggregate.addPeople(new Teacher("教师1", "11923020001"));
        peopleAggregate.addPeople(new Teacher("教师2", "11923020002"));
        peopleAggregate.addPeople(new Teacher("教师3", "11923020003"));
    }
}

1.3.7 运行结果:



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/984788.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号