1. 程式人生 > 其它 >P1640 [SCOI2010] 連續攻擊遊戲

P1640 [SCOI2010] 連續攻擊遊戲

需求案例

使用傳統的設計方案

傳統解決方案存在的問題

迭代器模式的基本介紹

迭代器模式的原理類圖

迭代器模式應用例項

程式碼實現

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();
    }
}

==========計算機學院=========
電腦科學與技術:電腦科學與技術描述
軟體工程:軟體工程描述
網路工程:網路工程描述
大資料:大資料描述
==========資訊工程學院=========
資訊分析:資訊分析描述
資訊統計:資訊統計描述
資訊抽取:資訊抽取描述

迭代器模式的注意事項和細節