午夜国产狂喷潮在线观看|国产AⅤ精品一区二区久久|中文字幕AV中文字幕|国产看片高清在线

    深入理解JavaScript系列(33):設(shè)計(jì)模式之策略模式詳解
    來源:易賢網(wǎng) 閱讀:703 次 日期:2015-03-06 11:11:13
    溫馨提示:易賢網(wǎng)小編為您整理了“深入理解JavaScript系列(33):設(shè)計(jì)模式之策略模式詳解”,方便廣大網(wǎng)友查閱!

    這篇文章主要介紹了深入理解JavaScript系列(33):設(shè)計(jì)模式之策略模式詳解,策略模式定義了算法家族,分別封裝起來,讓他們之間可以互相替換,此模式讓算法的變化不會影響到使用算法的客戶,需要的朋友可以參考下

    介紹

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

    正文

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

    代碼如下:

    validator = {

    validate: function (value, type) {

    switch (type) {

    case 'isNonEmpty ':

    {

    return true; // NonEmpty 驗(yàn)證結(jié)果

    }

    case 'isNumber ':

    {

    return true; // Number 驗(yàn)證結(jié)果

    break;

    }

    case 'isAlphaNum ':

    {

    return true; // AlphaNum 驗(yàn)證結(jié)果

    }

    default:

    {

    return true;

    }

    }

    }

    };

    // 測試

    alert(validator.validate("123", "isNonEmpty"));

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

    代碼如下:

    var validator = {

    // 所有可以的驗(yàn)證規(guī)則處理類存放的地方,后面會單獨(dú)定義

    types: {},

    // 驗(yàn)證類型所對應(yīng)的錯(cuò)誤消息

    messages: [],

    // 當(dāng)然需要使用的驗(yàn)證類型

    config: {},

    // 暴露的公開驗(yàn)證方法

    // 傳入的參數(shù)是 key => value對

    validate: function (data) {

    var i, msg, type, checker, result_ok;

    // 清空所有的錯(cuò)誤信息

    this.messages = [];

    for (i in data) {

    if (data.hasOwnProperty(i)) {

    type = this.config[i]; // 根據(jù)key查詢是否有存在的驗(yàn)證規(guī)則

    checker = this.types[type]; // 獲取驗(yàn)證規(guī)則的驗(yàn)證類

    if (!type) {

    continue; // 如果驗(yàn)證規(guī)則不存在,則不處理

    }

    if (!checker) { // 如果驗(yàn)證規(guī)則類不存在,拋出異常

    throw {

    name: "ValidationError",

    message: "No handler to validate type " + type

    };

    }

    result_ok = checker.validate(data[i]); // 使用查到到的單個(gè)驗(yàn)證類進(jìn)行驗(yàn)證

    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里存放的各種驗(yàn)證類了,我們這里只舉幾個(gè)例子:

    代碼如下:

    // 驗(yàn)證給定的值是否不為空

    validator.types.isNonEmpty = {

    validate: function (value) {

    return value !== "";

    },

    instructions: "傳入的值不能為空"

    };

    // 驗(yàn)證給定的值是否是數(shù)字

    validator.types.isNumber = {

    validate: function (value) {

    return !isNaN(value);

    },

    instructions: "傳入的值只能是合法的數(shù)字,例如:1, 3.14 or 2010"

    };

    // 驗(yàn)證給定的值是否只是字母或數(shù)字

    validator.types.isAlphaNum = {

    validate: function (value) {

    return !/[^a-z0-9]/i.test(value);

    },

    instructions: "傳入的值只能保護(hù)字母和數(shù)字,不能包含特殊字符"

    };

    使用的時(shí)候,我們首先要定義需要驗(yàn)證的數(shù)據(jù)集合,然后還需要定義每種數(shù)據(jù)需要驗(yàn)證的規(guī)則類型,代碼如下:

    代碼如下:

    var data = {

    first_name: "Tom",

    last_name: "Xu",

    age: "unknown",

    username: "TomXu"

    };

    validator.config = {

    first_name: 'isNonEmpty',

    age: 'isNumber',

    username: 'isAlphaNum'

    };

    最后,獲取驗(yàn)證結(jié)果的代碼就簡單了:

    代碼如下:

    validator.validate(data);

    if (validator.hasErrors()) { +

    console.log(validator.messages.join("\n"));

    }

    總結(jié)

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

    從另外一個(gè)層面上來說,單獨(dú)定義算法類,也方便了單元測試,因?yàn)榭梢酝ㄟ^自己的算法進(jìn)行單獨(dú)測試。

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

    更多信息請查看IT技術(shù)專欄

    更多信息請查看腳本欄目
    由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!

    2025國考·省考課程試聽報(bào)名

    • 報(bào)班類型
    • 姓名
    • 手機(jī)號
    • 驗(yàn)證碼
    關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機(jī)站點(diǎn) | 投訴建議
    工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網(wǎng)安備53010202001879號 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號
    云南網(wǎng)警備案專用圖標(biāo)
    聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號:hfpxwx
    咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
    云南網(wǎng)警報(bào)警專用圖標(biāo)