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?多层逻辑判断的优雅写法



相关文章
|
1天前
|
设计模式 前端开发 JavaScript
【JavaScript 技术专栏】JavaScript 设计模式与实战应用
【4月更文挑战第30天】本文探讨JavaScript设计模式在提升开发效率和代码质量中的关键作用。涵盖单例、工厂、观察者、装饰器和策略模式,并通过实例阐述其在全局状态管理、复杂对象创建、实时数据更新、功能扩展和算法切换的应用。理解并运用这些模式能帮助开发者应对复杂项目,提升前端开发能力。
|
1天前
|
设计模式 算法
设计模式之 Strategy(策略模式)
设计模式之 Strategy(策略模式)
23 1
|
1天前
|
设计模式 算法 PHP
php设计模式--策略模式(六)
php设计模式--策略模式(六)
11 0
|
1天前
|
设计模式 算法 搜索推荐
设计模式之策略模式
设计模式之策略模式
43 0
|
1天前
|
设计模式 算法 Java
小谈设计模式(3)—策略模式
小谈设计模式(3)—策略模式
|
1天前
|
设计模式 算法
【设计模式】阿里终面:你觉得这个例子是策略模式吗?
【设计模式】阿里终面:你觉得这个例子是策略模式吗?
9 1
|
1天前
|
设计模式 算法
大话设计模式(2)——策略模式
大话设计模式(2)——策略模式
7 1
|
1天前
|
设计模式 JavaScript 前端开发
js设计模式-观察者模式与发布/订阅模式
观察者模式和发布/订阅模式是JavaScript中的两种设计模式,用于处理对象间的通信和事件处理。观察者模式中,一个主题对象状态改变会通知所有观察者。实现包括定义主题和观察者对象,以及在主题中添加、删除和通知观察者的功能。发布/订阅模式则引入事件管理器,允许发布者发布事件,订阅者通过订阅接收通知。
|
1天前
|
设计模式 JavaScript 算法
js设计模式-策略模式与代理模式的应用
策略模式和代理模式是JavaScript常用设计模式。策略模式通过封装一系列算法,使它们可互换,让算法独立于客户端,提供灵活的选择。例如,定义不同计算策略并用Context类执行。代理模式则为对象提供代理以控制访问,常用于延迟加载或权限控制。如创建RealSubject和Proxy类,Proxy在调用RealSubject方法前可执行额外操作。这两种模式在复杂业务逻辑中发挥重要作用,根据需求选择合适模式解决问题。
|
1天前
|
设计模式 算法 Java
Java 设计模式:探索策略模式的概念和实战应用
【4月更文挑战第27天】策略模式是一种行为设计模式,它允许在运行时选择算法的行为。在 Java 中,策略模式通过定义一系列的算法,并将每一个算法封装起来,并使它们可以互换,这样算法的变化不会影响到使用算法的客户。
23 1

热门文章

最新文章