<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      代碼改變世界

      深入理解JavaScript系列(33):設計模式之策略模式

      2012-03-05 09:22  湯姆大叔  閱讀(19057)  評論(31)    收藏  舉報

      介紹

      策略模式定義了算法家族,分別封裝起來,讓他們之間可以互相替換,此模式讓算法的變化不會影響到使用算法的客戶。

      正文

      在理解策略模式之前,我們先來一個例子,一般情況下,如果我們要做數據合法性驗證,很多時候都是按照swith語句來判斷,但是這就帶來幾個問題,首先如果增加需求的話,我們還要再次修改這段代碼以增加邏輯,而且在進行單元測試的時候也會越來越復雜,代碼如下:

              validator = {
      validate: function (value, type) {
      switch (type) {
      case 'isNonEmpty ':
      {
      return true; // NonEmpty 驗證結果
      }
      case 'isNumber ':
      {
      return true; // Number 驗證結果
      break;
      }
      case 'isAlphaNum ':
      {
      return true; // AlphaNum 驗證結果
      }
      default:
      {
      return true;
      }
      }
      }
      };
      // 測試
      alert(validator.validate("123", "isNonEmpty"));

      那如何來避免上述代碼中的問題呢,根據策略模式,我們可以將相同的工作代碼單獨封裝成不同的類,然后通過統一的策略處理類來處理,OK,我們先來定義策略處理類,代碼如下:

      var validator = {

      // 所有可以的驗證規則處理類存放的地方,后面會單獨定義
      types: {},

      // 驗證類型所對應的錯誤消息
      messages: [],

      // 當然需要使用的驗證類型
      config: {},

      // 暴露的公開驗證方法
      // 傳入的參數是 key => value對
      validate: function (data) {

      var i, msg, type, checker, result_ok;

      // 清空所有的錯誤信息
      this.messages = [];

      for (i in data) {
      if (data.hasOwnProperty(i)) {

      type = this.config[i]; // 根據key查詢是否有存在的驗證規則
      checker = this.types[type]; // 獲取驗證規則的驗證類

      if (!type) {
      continue; // 如果驗證規則不存在,則不處理
      }
      if (!checker) { // 如果驗證規則類不存在,拋出異常
      throw {
      name: "ValidationError",
      message: "No handler to validate type " + type
      };
      }

      result_ok = checker.validate(data[i]); // 使用查到到的單個驗證類進行驗證
      if (!result_ok) {
      msg = "Invalid value for *" + i + "*, " + checker.instructions;
      this.messages.push(msg);
      }
      }
      }
      return this.hasErrors();
      },

      // helper
      hasErrors: function () {
      return this.messages.length !== 0;
      }
      };

      然后剩下的工作,就是定義types里存放的各種驗證類了,我們這里只舉幾個例子:

      // 驗證給定的值是否不為空
      validator.types.isNonEmpty = {
      validate: function (value) {
      return value !== "";
      },
      instructions: "傳入的值不能為空"
      };

      // 驗證給定的值是否是數字
      validator.types.isNumber = {
      validate: function (value) {
      return !isNaN(value);
      },
      instructions: "傳入的值只能是合法的數字,例如:1, 3.14 or 2010"
      };

      // 驗證給定的值是否只是字母或數字
      validator.types.isAlphaNum = {
      validate: function (value) {
      return !/[^a-z0-9]/i.test(value);
      },
      instructions: "傳入的值只能保護字母和數字,不能包含特殊字符"
      };

      使用的時候,我們首先要定義需要驗證的數據集合,然后還需要定義每種數據需要驗證的規則類型,代碼如下:

      var data = {
      first_name: "Tom",
      last_name: "Xu",
      age: "unknown",
      username: "TomXu"
      };

      validator.config = {
      first_name: 'isNonEmpty',
      age: 'isNumber',
      username: 'isAlphaNum'
      };

      最后,獲取驗證結果的代碼就簡單了:

      validator.validate(data);

      if (validator.hasErrors()) {
      console.log(validator.messages.join("\n"));
      }

      總結

      策略模式定義了一系列算法,從概念上來說,所有的這些算法都是做相同的事情,只是實現不同,他可以以相同的方式調用所有的方法,減少了各種算法類與使用算法類之間的耦合。

      從另外一個層面上來說,單獨定義算法類,也方便了單元測試,因為可以通過自己的算法進行單獨測試。

      實踐中,不僅可以封裝算法,也可以用來封裝幾乎任何類型的規則,是要在分析過程中需要在不同時間應用不同的業務規則,就可以考慮是要策略模式來處理各種變化。

      同步與推薦

      本文已同步至目錄索引:深入理解JavaScript系列

      深入理解JavaScript系列文章,包括了原創,翻譯,轉載等各類型的文章,如果對你有用,請推薦支持一把,給大叔寫作的動力。

      主站蜘蛛池模板: 婷婷色综合成人成人网小说 | 国产美女永久免费无遮挡| 国产精品中文字幕视频| 老色鬼在线精品视频在线观看| 国产亚洲精品第一综合| 九九热99精品视频在线| 亚洲午夜亚洲精品国产成人| 精品黄色av一区二区三区| 亚洲成人午夜排名成人午夜| 一区二区三区av天堂| 国产日产亚洲系列最新| 国产精品视频一区二区三区不卡 | 18禁午夜宅男成年网站| 少妇高潮灌满白浆毛片免费看 | 九九久久自然熟的香蕉图片| 欧美精品人人做人人爱视频| 亚洲人成人伊人成综合网无码| 久久精品国产再热青青青| аⅴ天堂中文在线网| 蜜桃一区二区三区在线看| 精品人妻av区乱码| 波多野结衣在线播放| 精品久久久bbbb人妻| 永久免费av网站可以直接看的| 国产av剧情md精品麻豆| 久人人爽人人爽人人片av| 国产中文字幕精品喷潮| 波多野结衣美乳人妻hd电影欧美| 亚洲一区二区三区激情在线| 高清有码国产一区二区| 嫩草成人AV影院在线观看| 一区二区三区午夜福利院| 久久国产成人午夜av影院| 精品国产精品国产偷麻豆| 一区二区中文字幕av| 成人免费亚洲av在线| 日韩人妻无码一区二区三区| 亚洲av无码乱码在线观看野外| 亚洲AV高清一区二区三区尤物| 无码欧美毛片一区二区三| 2019久久久高清日本道|