CodeWalk

策略模式消除条件分支重构实战

作者:我是大山 · 2026-05-30 12:55

请用策略模式重构一个包含大量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); }
}

优势:消除条件分支、算法独立可复用、易于扩展(新增策略无需修改原代码)、符合开闭原则。