時光匆匆又來到另一個假日(厭世感越來越重),鐵人賽還剩下三分之一,在每天一篇技術文的壓力之下,還是希望能維持一慣的水平,或是隨的寫作跟技術實力的提升而寫得更深入。
之後可能要修一下之前的文章XD
迭代器模式( Iterator ),提供一種方法依序存取一個聚合物件中各個元素,而又不暴露該物件的內部表示。
-- 大話設計模式 p.295
迭代器模式在現代的程式語言和應用中已經非常普遍,幾乎都已經擁有這個模式的實作了,所以大家對於如何使用已經非常熟悉,但對於實踐的方式就沒有這麼熟悉了,所以還是值得我們學習它背後的程式思維,引為借鏡期待可以舉一反三!
迭代器模式UML圖看起來複雜但是概念很簡單。
為了不暴露集合(或是容器)內部的細節,並且減少集合所需擔負的功能,所以將迭代器獨立出來。
試著實作Iterator pattern 發公司員工薪水···
Iterator 和 Aggregate 介面
public interface Iterator {
public Object First();
public Object Next();
public boolean IsDone();
public Object CurrentItem();
}
public interface Aggregate {
public Iterator CreateIterator();
}
簡單的員工類別
public class Employee {
String name;
String title;
public Employee(String name , String title){
this.name = name;
this.title = title;
}
}
公司類別
import java.util.ArrayList;
import java.util.List;
public class CompanyA implements Aggregate {
List<Employee> employees = new ArrayList<>();
public CompanyA(){
//為了方便先預先放入員工
employees.add(new Employee("小萱","業務"));
employees.add(new Employee("小尉","工程師"));
employees.add(new Employee("小陞","程序猿"));
employees.add(new Employee("阿偉","專案管理"));
employees.add(new Employee("小詩","吉祥物"));
employees.add(new Employee("阿農","分析兼司機"));
}
@Override
public Iterator CreateIterator() {
return new CompanaAIterator(this);
}
}
最重要的迭代器
public class CompanaAIterator implements Iterator {
private CompanyA companyA;
private int current = 0;
public CompanaAIterator(CompanyA companyA){
this.companyA = companyA;
}
@Override
public Object First() {
return companyA.employees.get(current);
}
@Override
public Object Next() {
Object ret = null;
current++;
if( current < companyA.employees.size()){
ret = companyA.employees.get(current);
}
return ret;
}
@Override
public boolean IsDone() {
return current >= companyA.employees.size() ? true : false ;
}
@Override
public Object CurrentItem() {
return companyA.employees.get(current);
}
}
做一下測試
public class Test {
@org.junit.jupiter.api.Test
public void test(){
CompanyA companyA = new CompanyA();
Iterator iterator = companyA.CreateIterator();
while(!iterator.IsDone()){
System.out.println( ((Employee)iterator.CurrentItem()).name + " : " + ((Employee)iterator.CurrentItem()).title + " 發薪水囉~");
iterator.Next();
}
}
}
結果
小萱 : 業務 發薪水囉~
小尉 : 工程師 發薪水囉~
小陞 : 程序猿 發薪水囉~
阿偉 : 專案管理 發薪水囉~
小詩 : 吉祥物 發薪水囉~
阿農 : 分析兼司機 發薪水囉~
在現在程序語言中的迭代器函數式更多,但是基礎建設是一樣的~所以可以藉由這個基礎去做實踐喔!