亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

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

2019-11-20 13:02:02
字體:
來源:轉載
供稿:網友

介紹

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

正文

在理解策略模式之前,我們先來一個例子,一般情況下,如果我們要做數據合法性驗證,很多時候都是按照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"));
}


總結

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

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩一区视频在线| 黄色一区二区在线观看| 久久免费视频观看| 亚洲成av人影院在线观看| 97香蕉超级碰碰久久免费的优势| 国产99久久精品一区二区永久免费| 亚洲free性xxxx护士白浆| 成人写真福利网| 欧美午夜丰满在线18影院| 久久色在线播放| 成人av色在线观看| 亚洲欧美综合另类中字| 国产精品亚洲第一区| 国产亚洲欧美日韩精品| 欧美日韩一区二区免费在线观看| 久久精品色欧美aⅴ一区二区| 亚洲精品福利视频| 亚洲国产精品va在线看黑人| 欧美综合国产精品久久丁香| 欧美一级免费视频| 国内成人精品一区| 日韩免费黄色av| 久久精品国产一区| 欧美黑人性生活视频| 亚洲欧美色图片| 国产91网红主播在线观看| 日韩中文字幕视频在线观看| 精品美女久久久久久免费| 日韩精品极品在线观看播放免费视频| 成人性生交xxxxx网站| 91精品国产高清久久久久久| 久久中文久久字幕| 欧美自拍视频在线| 亚洲韩国日本中文字幕| 亚洲国产成人一区| 亚洲精品福利视频| 777777777亚洲妇女| 91精品91久久久久久| 丝袜美腿精品国产二区| 欧美日韩国产精品一区二区不卡中文| 国产精品男人爽免费视频1| 久久久久久久久久久久av| 国产精品成人av性教育| 久久夜色撩人精品| 欧美最顶级丰满的aⅴ艳星| 亚洲日韩中文字幕在线播放| 亚洲精品有码在线| 午夜精品久久久久久久久久久久| 最新69国产成人精品视频免费| 国产精品国产自产拍高清av水多| 亚洲美女性生活视频| 欧美性极品少妇精品网站| 久久亚洲电影天堂| 欧美亚洲激情视频| 91亚洲精华国产精华| 亚洲精品美女久久| 久久久久久久久国产| 欧美成人免费一级人片100| 欧美色另类天堂2015| 久久亚洲精品小早川怜子66| 欧美精品激情blacked18| 欧美激情视频在线免费观看 欧美视频免费一| 久久久久久久久久久人体| 亚洲三级 欧美三级| 欧美一区二粉嫩精品国产一线天| 国产精品国产自产拍高清av水多| 色狠狠久久aa北条麻妃| 久久成人在线视频| 欧美日韩精品在线观看| 亚洲在线一区二区| 日韩久久精品电影| 欧美国产日本高清在线| 欧美日韩亚洲精品内裤| 播播国产欧美激情| 91精品视频专区| 国产精品久久中文| 亚洲成在人线av| 欧美在线观看www| 久久亚洲私人国产精品va| 国产精品成人一区| 亚洲free性xxxx护士hd| 欧美老女人在线视频| 成人激情在线观看| 欧美高清在线视频观看不卡| 欧美与欧洲交xxxx免费观看| 精品精品国产国产自在线| 国产欧美在线观看| 在线观看日韩专区| 黄色成人在线免费| 日韩精品在线播放| 日韩网站免费观看| 国产欧美日韩丝袜精品一区| 理论片在线不卡免费观看| 亚洲精品一区中文字幕乱码| 亚洲欧美日韩另类| 91欧美精品成人综合在线观看| 精品亚洲一区二区| www国产精品视频| 最近2019中文字幕一页二页| 日韩精品久久久久久久玫瑰园| 免费91麻豆精品国产自产在线观看| 亚洲欧美一区二区三区久久| 日韩精品视频免费| 午夜精品久久久久久99热软件| 国产视频精品va久久久久久| 国产一区二区三区在线免费观看| 亚洲第一网站男人都懂| 亚洲午夜未满十八勿入免费观看全集| 亚洲成人精品久久| 26uuu另类亚洲欧美日本一| 亚洲人成电影在线观看天堂色| 98精品国产高清在线xxxx天堂| 两个人的视频www国产精品| 97久久精品在线| 992tv成人免费视频| 亚洲韩国欧洲国产日产av| 欧美日韩精品在线视频| 亚洲欧洲国产精品| 欧美性高潮在线| 国产精品入口尤物| 国产精品99久久久久久人| 国产不卡在线观看| 97视频在线观看免费高清完整版在线观看| 亚洲高清一区二| 欧美黑人极品猛少妇色xxxxx| 欧美国产高跟鞋裸体秀xxxhd| 欧美极品少妇xxxxⅹ免费视频| 国产精品高潮呻吟久久av黑人| 97超碰蝌蚪网人人做人人爽| 亚洲iv一区二区三区| 青青在线视频一区二区三区| 国产一区二区三区精品久久久| 日韩精品视频在线观看网址| 欧美激情国产日韩精品一区18| 中文字幕欧美精品日韩中文字幕| 中文字幕日韩免费视频| 青青久久aⅴ北条麻妃| 亚洲欧美日韩精品久久| 在线看日韩av| 国产精品wwwwww| 浅井舞香一区二区| 亚洲欧美在线x视频| 中文字幕精品网| 日韩在线不卡视频| 亚州成人av在线| 91精品视频在线免费观看| 国产成人精品在线观看| 亚洲欧美日韩直播| 成人免费大片黄在线播放| 欧美wwwwww| 久久精品国产v日韩v亚洲| 欧美国产日韩视频| 尤物tv国产一区| 欧美激情亚洲综合一区| 中文在线资源观看视频网站免费不卡| 日韩欧美在线视频日韩欧美在线视频| 久久97久久97精品免视看| 精品国产户外野外| 在线看日韩欧美| 一区二区三区久久精品| 欧美电影免费播放| 欧美黑人一级爽快片淫片高清| 久久影院中文字幕| 成人午夜一级二级三级|