Javascript设计模式之策略模式

简介: Javascript设计模式之策略模式

定义

定义一系列的算法,把它们一个个封装起来,并可以随意的相互替换。 策略模式的目的就是将算法的使用与算法的实现分离开来(将各种算法的代码、 内部数据和依赖关系与其他代码隔离开来)。

优缺点

优点:

  • 优化一些多重条件的逻辑判断代码
  • 开放封闭原则,易于切换算法,易于扩展
  • 将不同行为抽取到一个独立类层次结构中,并将原始类组合成同一个,从而减少重复代码,易于复用

缺点:

  • 程序中会有较多策略类

适用范围

  • 需要了解算法的不同点,才可以编写合适的策略类(即算法规则)
  • 算法的使用与算法的实现分离开,也就是说,算法的上下文逻辑不是特别重要,这样才有分离的意义

策略模式的组成

一个策略模式至少由两部分组成。

  • 第一个部分是一组策略类,策略类封装了具体的算法,并负责具体的计算过程。
  • 第二个部分是环境类 Context,Context 接受客户的请求,随后把请求委托给某一个策略类。

示例一:优化表单校验代码

需求背景

假设一个表单提交时,需要验证一下信息:

  • 用户名不能为空
  • 密码长度不能少于6位
  • 手机号码必须符合格式

常规写法

const form = document.getElementById('registerForm');
form.onsubmit = function () {
  if (form.userName.value === '') {
    alert('用户名不能为空');
    return false;
  }
  if (form.password.value.length < 6) {
    alert('密码长度不能少于6位');
    return false;
  }
  if (!/^1[3|5|8][0-9]{9}$/.test(form.phoneNumber.value)) {
    alert('手机号码格式不正确');
    return false;
  }
}
复制代码

缺点:

  • if-else语句太多,onsubmit函数庞大
  • 违反开放-封闭原则:需要新增一个校验规则时,需要修改onsubmit函数内部

使用策略模式

// step1:编写策略类
const strategies = {
  isNonEmpty: function (value, errMsg) {
    if (value === '') {
      return errMsg;
    }
  },
  minLenth: function (value, length, errMsg) {
    if (value.length < length) {
      return errMsg;
    }
  },
  isMobile: function (value, errMsg) {
    if (!/^1[3|5|8][0-9]{9}$/.test(value)) {
      return errMsg;
    }
  }
}
// step2:定义环境类 Context
class Validator {
 constructor() {
  this.cache = [];
 }
 add(dom, rule, errMsg) {
  const arr = rule.split(':');
  this.cache.push(() => {
   const strategy = arr.shift();
   arr.unshift(dom.value);
   arr.push(errMsg);
   return strategies[strategy].apply(dom, arr);
  })
 }
 start() {
  for (let i = 0; i < this.cache.length; i++) {
   const msg = this.cache[i]();
   if (msg) return msg;
  }
 }
}
// step3:调用策略
form.onsubmit = function () {
 const validator = new Validator();
 validator.add(form.userName, 'isNonEmpty', '用户名不能为空');
 validator.add(form.password, 'minLength:6', '密码长度不能少于6位');
 validator.add(form.phoneNumber, 'isMobile', '手机号码格式不正确');
 const errMsg = validator.start();
 if (errMsg) {
  alert(errMsg);
  return false;
 }
}
复制代码

示例二:减少if-else

只会if-else和switch?多层逻辑判断的优雅写法



相关文章
|
Web App开发 JavaScript 算法
|
设计模式 算法 JavaScript
「设计模式 JavaScript 描述」策略模式
「设计模式 JavaScript 描述」策略模式
|
设计模式 存储 算法
JavaScript 设计模式之策略模式
什么是设计模式?为什么需要学习设计模式?
148 0
JavaScript 设计模式之策略模式
|
设计模式 JavaScript 前端开发
JavaScript设计模式-策略模式(10)
JavaScript设计模式-策略模式(10)
|
设计模式 算法 JavaScript
JavaScript中的设计模式-策略模式
设计模式在我们编程中是十分重要的! 设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。
|
设计模式 JavaScript 前端开发
「设计模式 JavaScript 描述」模板方法模式
「设计模式 JavaScript 描述」模板方法模式
|
设计模式 JavaScript 前端开发
JavaScript设计模式-装饰器模式(4)
JavaScript设计模式-装饰器模式(4)
|
设计模式 JavaScript 前端开发
JavaScript设计模式-建造者模式(2)
JavaScript设计模式-建造者模式(2)
|
设计模式 JavaScript 前端开发
JavaScript设计模式-中介者模式(13)
JavaScript设计模式-中介者模式(13)
JavaScript设计模式-中介者模式(13)
|
设计模式 JavaScript 前端开发
「设计模式 JavaScript 描述」组合模式
「设计模式 JavaScript 描述」组合模式
「设计模式 JavaScript 描述」组合模式

热门文章

最新文章