[GoF] 疊代器模式 Iterator
疊代器模式其實已經內建在大多數的高階語言中,像是 JavaScript 中為 Array 提供的 forEach
、map
、filter
等等都是迭代器模式。
假設我們要判斷一個人符不符合購買商品資格,我們可能會列出許多不同的購買規則:
type Person = {
age: number;
illness: string[];
income: number;
};
function isAdult(buyer: Person) {
return buyer.age >= 18;
}
function isHealth(buyer: Person) {
return buyer.illness.length < 5;
}
function hasEnoughIncome(buyer: Person) {
return buyer.income >= 600000;
}
接著我們可以利用迭代器的方法,針對要購買的人去跑每一個規則:
const rules = [isAdult, isHealth, hasEnoughIncome];
const canBuyTheProduct = (buyer: Person) => rules.every((rule) => rule(buyer));
由於這裡我們把每一項規則都放在 rules
陣列中,未來如果有新的規則要增加,只需要把規則添加到陣列內即可。
在 canButTheProduct
則透過 iterator 的方式,對購買人去核對每一項購買規則即可:
const aaron: Person = {
age: 20,
illness: ['obesity'],
income: 610000,
};
canBuyTheProduct(aaron); // true
這種模式還有一個好處是,規則執行是有先後順序的,如果前面的規則就不符合的話,就不用再驗證後面的規則。
如果沒用迭代器
這裡如果我們沒有使用迭代器模式的概念,可能會寫出類似的函式:
const canBuyTheProduct = (buyer: Person) => {
return buyer.age >= 18 && buyer.illness.length < 5 && buyer.income >= 600000;
};