欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript設(shè)計(jì)模式之策略模式實(shí)現(xiàn)原理詳解

 更新時(shí)間:2020年05月29日 09:06:39   作者:javascript癡癡  
這篇文章主要介紹了JavaScript設(shè)計(jì)模式之策略模式實(shí)現(xiàn)原理詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

俗話說,條條大路通羅馬。在現(xiàn)實(shí)生活中,我們可以采用很多方法實(shí)現(xiàn)同一個(gè)目標(biāo)。比如我們先定個(gè)小目標(biāo),先掙它一個(gè)億。我們可以根據(jù)具體的實(shí)際情況來完成這個(gè)目標(biāo)。

策略模式的定義

定義一系列的算法,把它們一個(gè)個(gè)封裝起來,并且使它們可以相互替換。

舉個(gè)例子:表單校驗(yàn)

在一個(gè)Web項(xiàng)目中,注冊(cè)、登錄等功能的實(shí)現(xiàn)都離不開表單提交。表單校驗(yàn)也是前端常常需要做的事。假設(shè)我們正在編寫一個(gè)注冊(cè)的頁(yè)面,在點(diǎn)擊提交按鈕之前,有如下幾條校驗(yàn)邏輯:

  • 用戶名不可為空,不允許以空白字符命名,用戶名長(zhǎng)度不能小于2位。
  • 密碼長(zhǎng)度不能小于6位。
  • 正確的手機(jī)號(hào)碼格式。

也許,一開始我們會(huì)這么寫:

<html>
<head>
  <title>策略模式-校驗(yàn)表單</title>
  <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
</head>
<body>
  <form id = "registerForm" method="post" action="http://xxxx.com/api/register">
    用戶名:<input type="text" name="userName">
    密碼:<input type="text" name="password">
    手機(jī)號(hào)碼:<input type="text" name="phoneNumber">
    <button type="submit">提交</button>
  </form>
  <script type="text/javascript">
    var registerForm = document.getElementById('registerForm');
    registerForm.onsubmit = function() {
      if (registerForm.userName.value === '') {
        alert('用戶名不可為空');
        return false;
      }
      if (registerForm.userName.value === '') {
        alert('用戶名不可為空');
        return false;
      } 
      if (registerForm.userName.value.trim() === '') {
        alert('用戶名不允許以空白字符命名');
        return false;
      } 
      if (registerForm.userName.value.trim().length < 2) {
        alert('用戶名用戶名長(zhǎng)度不能小于2位');
        return false;
      } 
      if (registerForm.password.value.trim().length < 6) {
        alert('密碼長(zhǎng)度不能小于6位');
        return false;
      }
      if (!/^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|17[7]|18[0|1|2|3|5|6|7|8|9])\d{8}$/.test(registerForm.phoneNumber.value)) {
        alert('請(qǐng)輸入正確的手機(jī)號(hào)碼格式');
        return errorMsg;
       } 
    }
  </script>
</body>
</html>

這是一種很常見的編碼方式,但它有很明顯的缺點(diǎn):

  • registerForm.onsubmit 函數(shù)比較龐大,包含了很多if語(yǔ)句,這些語(yǔ)句要覆蓋所有的校驗(yàn)規(guī)則。
  • 若校驗(yàn)規(guī)則有變,不得不深入到registerForm.onsubmit 函數(shù)的內(nèi)部實(shí)現(xiàn),違反開放-封閉原則。
  • 算法的復(fù)用性差。

下面,讓我們來用策略模式重構(gòu)表單校驗(yàn)

策略模式:表單校驗(yàn)

<html>
<head>
  <title>策略模式-校驗(yàn)表單</title>
  <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
</head>
<body>
  <form id = "registerForm" method="post" action="http://xxxx.com/api/register">
    用戶名:<input type="text" name="userName">
    密碼:<input type="text" name="password">
    手機(jī)號(hào)碼:<input type="text" name="phoneNumber">
    <button type="submit">提交</button>
  </form>
  <script type="text/javascript">
    // 策略對(duì)象
    var strategies = {
      isNoEmpty: function (value, errorMsg) {
        if (value === '') {
          return errorMsg;
        }
      },
      isNoSpace: function (value, errorMsg) {
        if (value.trim() === '') {
          return errorMsg;
        }
      },
      minLength: function (value, length, errorMsg) {
        if (value.trim().length < length) {
          return errorMsg;
        }
      },
      maxLength: function (value, length, errorMsg) {
        if (value.length > length) {
          return errorMsg;
        }
      },
      isMobile: function (value, errorMsg) {
        if (!/^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|17[7]|18[0|1|2|3|5|6|7|8|9])\d{8}$/.test(value)) {
          return errorMsg;
        }        
      }
    }

    // 驗(yàn)證類
    var Validator = function() {
      this.cache = [];
    }
    Validator.prototype.add = function(dom, rules) {
      var self = this;
      for(var i = 0, rule; rule = rules[i++];) {
        (function(rule) {
          var strategyAry = rule.strategy.split(':');
          var errorMsg = rule.errorMsg;
          self.cache.push(function() {
          var strategy = strategyAry.shift();
          strategyAry.unshift(dom.value);
          strategyAry.push(errorMsg);
          return strategies[strategy].apply(dom, strategyAry);
          })
        })(rule)
      }
    };
    Validator.prototype.start = function() {
      for(var i = 0, validatorFunc; validatorFunc = this.cache[i++];) {
        var errorMsg = validatorFunc();
        if (errorMsg) {
          return errorMsg;
        }
      }
    };

    // 調(diào)用代碼
    var registerForm = document.getElementById('registerForm');

    var validataFunc = function() {
      var validator = new Validator();
      validator.add(registerForm.userName, [{
        strategy: 'isNoEmpty',
        errorMsg: '用戶名不可為空'
      }, {
        strategy: 'isNoSpace',
        errorMsg: '不允許以空白字符命名'
      }, {
        strategy: 'minLength:2',
        errorMsg: '用戶名長(zhǎng)度不能小于2位'
      }]);
      validator.add(registerForm.password, [ {
        strategy: 'minLength:6',
        errorMsg: '密碼長(zhǎng)度不能小于6位'
      }]);
      validator.add(registerForm.phoneNumber, [{
        strategy: 'isMobile',
        errorMsg: '請(qǐng)輸入正確的手機(jī)號(hào)碼格式'
      }]);
      var errorMsg = validator.start();
      return errorMsg;
    }

    registerForm.onsubmit = function() {
      var errorMsg = validataFunc();
      if (errorMsg) {
        alert(errorMsg);
        return false;
      }
    }
  </script>
</body>
</html>

策略模式優(yōu)缺點(diǎn)

策略模式是一種常用且有效的設(shè)計(jì)模式。

  • 策略模式可以有效避免多重條件選擇語(yǔ)句。
  • 策略模式提供了對(duì)開放-封裝原則的完美支持,將方法封裝在獨(dú)立的strategy中,使得它們易于切換,易于理解,易于擴(kuò)展。
  • 復(fù)用性高。

當(dāng)然,策略模式也有一些缺點(diǎn)

  • 增加了許多策略類或者策略對(duì)象。
  • 要使用策略模式,必須了解所有的strategy,違反了最少知識(shí)原則。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • uniapp中全局頁(yè)面掛載組件實(shí)戰(zhàn)過程(小程序)

    uniapp中全局頁(yè)面掛載組件實(shí)戰(zhàn)過程(小程序)

    這篇文章主要給大家介紹了關(guān)于uniapp中全局頁(yè)面掛載組件(小程序)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用uniapp具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-12-12
  • 小程序跳轉(zhuǎn)H5頁(yè)面的方法步驟

    小程序跳轉(zhuǎn)H5頁(yè)面的方法步驟

    這篇文章主要介紹了小程序跳轉(zhuǎn)H5頁(yè)面的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • js 限制input只能輸入數(shù)字、字母和漢字等等

    js 限制input只能輸入數(shù)字、字母和漢字等等

    js 限制input只能輸入數(shù)字小數(shù)點(diǎn)也不能輸入或者是只能輸入數(shù)字,能輸小數(shù)點(diǎn)等等,本文大致整理了一些,感興趣的朋友可以收藏下
    2013-12-12
  • 微信小程序 頁(yè)面跳轉(zhuǎn)傳值實(shí)現(xiàn)代碼

    微信小程序 頁(yè)面跳轉(zhuǎn)傳值實(shí)現(xiàn)代碼

    這篇文章主要介紹了微信小程序 頁(yè)面跳轉(zhuǎn)傳值實(shí)現(xiàn)代碼的相關(guān)資料,這里分析實(shí)現(xiàn)的條件及實(shí)例代碼,需要的朋友可以參考下
    2017-07-07
  • javascript-解決mongoose數(shù)據(jù)查詢的異步操作

    javascript-解決mongoose數(shù)據(jù)查詢的異步操作

    這篇文章主要介紹了javascript-解決mongoose數(shù)據(jù)查詢的異步操作,具有一定的參考價(jià)值,有興趣的可以了解一下。
    2016-12-12
  • JavaScript實(shí)用技巧(一)

    JavaScript實(shí)用技巧(一)

    本文從7個(gè)方面講述 JavaScript 中那些你不很熟知但非常實(shí)用的技巧。
    2010-08-08
  • 一文讀懂微信小程序頁(yè)面導(dǎo)航

    一文讀懂微信小程序頁(yè)面導(dǎo)航

    微信小程序是一種不需要下載安裝即可使用的應(yīng)用,它實(shí)現(xiàn)了應(yīng)用“觸手可及”的夢(mèng)想,用戶掃一掃或者搜一下即可打開應(yīng)用,下面這篇文章主要給大家介紹了關(guān)于如何通過一文讀懂微信小程序頁(yè)面導(dǎo)航的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • JS FormData上傳文件的設(shè)置方法

    JS FormData上傳文件的設(shè)置方法

    使用FormData上傳文件時(shí),總是獲取不到req.file對(duì)象。發(fā)現(xiàn)是沒有配置對(duì)FormData導(dǎo)致的,怎么解決這個(gè)問題呢?下面小編給大家?guī)砹薐S FormData上傳文件的設(shè)置方法,需要的朋友參考下吧
    2017-07-07
  • JavaScript 模式之工廠模式(Factory)應(yīng)用介紹

    JavaScript 模式之工廠模式(Factory)應(yīng)用介紹

    工廠模式也是對(duì)象創(chuàng)建模式之一,它通常在類或類的靜態(tài)方法中去實(shí)現(xiàn),本文將詳細(xì)介紹JavaScript 工廠模式
    2012-11-11
  • JavaScript匿名函數(shù)之模仿塊級(jí)作用域

    JavaScript匿名函數(shù)之模仿塊級(jí)作用域

    這篇文章主要介紹了JavaScript匿名函數(shù)之模仿塊級(jí)作用域的相關(guān)資料,需要的朋友可以參考下
    2015-12-12

最新評(píng)論