Java學習之Idea搭建Servlet專案
阿新 • • 發佈:2020-12-01
迭代器模式
- 迭代器模式(Iterator Pattern)是常用的設計模式,屬於行為型模式
- 如果我們的集合元素是用不同的方式實現的,有陣列,還有java的集合類,或者還有其他方式,當客戶端要遍歷這些集合元素的時候就要使用多種遍歷方式,而且還會暴露元素的內部結構,可以考慮使用迭代器模式解決。
- 迭代器模式,提供一種遍歷集合元素的統一介面,用一致的方法遍歷集合元素,不需要知道集合物件的底層表示,即:不暴露其內部的結構。
應用例項
編寫程式展示一個學校院系結構:需求是這樣,要在一個頁面中展示出學校的院系組成, 一個學校有多個學院,一個學院有多個系。
public class Client { public static void main(String[] args) { // TODO Auto-generated method stub //建立學院 List<College> collegeList = new ArrayList<College>(); ComputerCollege computerCollege = new ComputerCollege(); InfoCollege infoCollege = new InfoCollege(); collegeList.add(computerCollege); //collegeList.add(infoCollege); OutPutImpl outPutImpl = new OutPutImpl(collegeList); outPutImpl.printCollege(); } }
public interface College {
public String getName();
//增加系的方法
public void addDepartment(String name, String desc);
//返回一個迭代器,遍歷
public Iterator createIterator();
}
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() { // TODO Auto-generated method stub return "計算機學院"; } @Override public void addDepartment(String name, String desc) { // TODO Auto-generated method stub Department department = new Department(name, desc); departments[numOfDepartment] = department; numOfDepartment += 1; } @Override public Iterator createIterator() { // TODO Auto-generated method stub return new ComputerCollegeIterator(departments); } }
public class ComputerCollegeIterator implements Iterator { //這裡我們需要Department 是以怎樣的方式存放=>陣列 Department[] departments; int position = 0; //遍歷的位置 public ComputerCollegeIterator(Department[] departments) { this.departments = departments; } //判斷是否還有下一個元素 @Override public boolean hasNext() { // TODO Auto-generated method stub if(position >= departments.length || departments[position] == null) { return false; }else { return true; } } @Override public Object next() { // TODO Auto-generated method stub Department department = departments[position]; position += 1; return department; } //刪除的方法,預設空實現 public void remove() { } }
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;
}
}
public class InfoCollege implements College {
List<Department> departmentList;
public InfoCollege() {
departmentList = new ArrayList<Department>();
addDepartment("資訊保安專業", " 資訊保安專業 ");
addDepartment("網路安全專業", " 網路安全專業 ");
addDepartment("伺服器安全專業", " 伺服器安全專業 ");
}
@Override
public String getName() {
// TODO Auto-generated method stub
return "資訊工程學院";
}
@Override
public void addDepartment(String name, String desc) {
// TODO Auto-generated method stub
Department department = new Department(name, desc);
departmentList.add(department);
}
@Override
public Iterator createIterator() {
// TODO Auto-generated method stub
return new InfoColleageIterator(departmentList);
}
}
public class InfoColleageIterator implements Iterator {
List<Department> departmentList; // 資訊工程學院是以List方式存放系
int index = -1;//索引
public InfoColleageIterator(List<Department> departmentList) {
this.departmentList = departmentList;
}
//判斷list中還有沒有下一個元素
@Override
public boolean hasNext() {
// TODO Auto-generated method stub
if(index >= departmentList.size() - 1) {
return false;
} else {
return true;
}
}
@Override
public Object next() {
index += 1;
return departmentList.get(index);
}
//空實現remove
public void remove() {
}
}
public class OutPutImpl {
//學院集合
List<College> collegeList;
public OutPutImpl(List<College> collegeList) {
this.collegeList = collegeList;
}
//遍歷所有學院,然後呼叫printDepartment 輸出各個學院的系
public void printCollege() {
//從collegeList 取出所有學院, Java 中的 List 已經實現Iterator
Iterator<College> iterator = collegeList.iterator();
while(iterator.hasNext()) {
//取出一個學院
College college = iterator.next();
System.out.println("=== "+college.getName() +"=====" );
printDepartment(college.createIterator()); //得到對應迭代器
}
}
//輸出 學院輸出 系
public void printDepartment(Iterator iterator) {
while(iterator.hasNext()) {
Department d = (Department)iterator.next();
System.out.println(d.getName());
}
}
}
迭代器模式的注意事項和細節
- 優點
- 提供一個統一的方法遍歷物件,客戶不用再考慮聚合的型別,使用一種方法就可以遍歷物件了。
- 隱藏了聚合的內部結構,客戶端要遍歷聚合的時候只能取到迭代器,而不會知道聚合的具體組成。
- 提供了一種設計思想,就是一個類應該只有一個引起變化的原因(叫做單一責任原則)。在聚合類中,我們把迭代器分開,就是要把管理物件集合和遍歷物件集合的責任分開,這樣一來集 合改變的話,隻影響到聚合物件。而如果遍歷方式改變的話,隻影響到了迭代器。
- 當要展示一組相似物件,或者遍歷一組相同對 象時使用,適合使用迭代器模式。
- 每個聚合物件都要-一個迭代器,會生成多個迭代器不好管理類