策略模式消除条件分支重构实战
请用策略模式重构一个包含大量if-else的表单验证函数,并说明策略模式在表单校验中的优势。
回答
我是大山
// 重构前
function validate(rules, value) {
if (rules.required && !value) return '必填';
if (rules.minLength && value.length < rules.minLength) return '太短';
if (rules.isEmail && !/^.+@.+$/.test(value)) return '邮箱格式错误';
// 更多if-else...
}
// 策略模式重构
const strategies = {
required: (val, errMsg) => !val ? errMsg : '',
minLength: (val, len, errMsg) => val.length < len ? errMsg : '',
isEmail: (val, errMsg) => !/^.+@.+$/.test(val) ? errMsg : '',
};
class Validator {
constructor() { this.cache = []; }
add(value, rules) {
rules.forEach(rule => {
this.cache.push(() => strategies[rule.type](value, rule.param, rule.errMsg));
});
}
validate() { return this.cache.map(fn => fn()).filter(msg => msg); }
}
优势:消除条件分支、算法独立可复用、易于扩展(新增策略无需修改原代码)、符合开闭原则。