一、前言:
迭代器模式的注意事项和细节:
优点:
- 提供一个统一的方法遍历对象,客户不用再考虑聚合的类型,使用一种方式就可以遍历对象。
- 隐藏了聚合的内部结构,客户端要遍历对象的时候只需要取迭代器,而不需知道聚合的具体组成。
- 遵循了单一职责原则,如果遍历方式改变,只影响到了迭代器。
缺点:
- 每个聚合对象都需要一个迭代器,会生成多个迭代器不方便管理。
二、迭代器模式:
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 日