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