P1640 [SCOI2010] 連續攻擊遊戲
阿新 • • 發佈:2022-12-02
需求案例
使用傳統的設計方案
傳統解決方案存在的問題
迭代器模式的基本介紹
迭代器模式的原理類圖
迭代器模式應用例項
程式碼實現
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();
}
}
==========計算機學院=========
電腦科學與技術:電腦科學與技術描述
軟體工程:軟體工程描述
網路工程:網路工程描述
大資料:大資料描述
==========資訊工程學院=========
資訊分析:資訊分析描述
資訊統計:資訊統計描述
資訊抽取:資訊抽取描述
迭代器模式的注意事項和細節