2026-10-22 09:46:50
策略模式是 JavaScript 中一种将算法封装为独立对象并可相互替换的设计模式,通过分离变化部分与不变逻辑,提升代码的灵活性、可维护性和复用性。 以下是具体实现技巧与案例解析:
一、核心概念策略模式由两部分组成:
缺点:
优势:
步骤 1:定义验证策略
var strategies = { isEmpty: function(val, msg) { if (!val) return msg; }, minLength: function(val, length, msg) { if (val.length < length) return msg; }, isTel: function(val, msg) { if (!/^1[358]d{9}$/.test(val)) return msg; }};步骤 2:实现验证器(环境类)
class Validator { constructor() { this.cache = []; } add(attr, rule, msg) { const ruleArr = rule.split(":"); this.cache.push(() => { const strategy = ruleArr.shift(); ruleArr.unshift(attr); ruleArr.push(msg); return strategies[strategy].apply(attr, ruleArr); }); } start() { for (const validator of this.cache) { const msg = validator(); if (msg) return msg; } }}步骤 3:配置验证规则并执行
function validFn() { const validator = new Validator(); const { username, password, tel } = infoForm; validator.add(username, "isEmpty", "用户名不能为空"); validator.add(password, "minLength:6", "密码长度不足"); validator.add(tel, "isTel", "手机号格式错误"); return validator.start();}function submit() { const msg = validFn(); if (msg) { Toast(msg); return false; } console.log("验证通过");}四、动态扩展规则若需为同一字段配置多条规则(如用户名同时检查非空与长度),可修改 Validator.add 方法支持数组参数:
class Validator { add(attr, rules) { rules.forEach(rule => { const ruleArr = rule.strategy.split(":"); const msg = rule.msg; this.cache.push(() => { const strategy = ruleArr.shift(); ruleArr.unshift(attr); ruleArr.push(msg); return strategies[strategy].apply(attr, ruleArr); }); }); }}// 使用示例validator.add(username, [ { strategy: "isEmpty", msg: "用户名不能为空" }, { strategy: "minLength:6", msg: "用户名长度不足" }]);五、策略模式的核心价值通过策略模式,可将复杂逻辑拆解为独立、可替换的模块,显著提升代码的可维护性与扩展性。