跳至主要内容

[GoF] 疊代器模式 Iterator

疊代器模式其實已經內建在大多數的高階語言中,像是 JavaScript 中為 Array 提供的 forEachmapfilter 等等都是迭代器模式。

假設我們要判斷一個人符不符合購買商品資格,我們可能會列出許多不同的購買規則:

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

Giscus