策略模式-javascript

一個基於策略模式的程序至少由兩部分組成。
第一個部分是一組策略類,策略類封裝了具體的算法,並負責具體的計算過程。第二個部分是環境類Context,Context接受客戶的請求,隨後把請求委託給某一個策略類。算法

優勢:函數

  • 策略模式利用組合、委託和多態等技術和思想,能夠有效地避免多重條件選擇語句。ui

  • 策略模式提供了對開放—封閉原則的完美支持,將算法封裝在獨立的strategy中,使得它們易於切換,易於理解,易於擴展。this

  • 策略模式中的算法也能夠複用在系統的其餘地方,從而避免許多重複的複製粘貼工做。prototype

  • 在策略模式中利用組合和委託來讓Context擁有執行算法的能力,這也是繼承的一種更輕便的替代方案。code

缺點:對象

  • 首先,使用策略模式會在程序中增長許多策略類或者策略對象,但實際上這比把它們負責的邏輯堆砌在Context中要好。繼承

  • 其次,要使用策略模式,必須瞭解全部的strategy,必須瞭解各個strategy之間的不一樣點,這樣才能選擇一個合適的strategy。好比,咱們要選擇一種合適的旅遊出行路線,必須先了解選擇飛機、火車、自行車等方案的細節。此時strategy要向客戶暴露它的全部實現,這是違反最少知識原則的。it

策略模塊:(環境類)io

define(function () {
    'use strict';

    var Validator = function () { };

    Validator.prototype.selectValidator = function (validator) {
        this.validator = validator;//validator就是驗證函數

        return this;  //this指向validator對象
    };

    Validator.prototype.validate = function (value) {
        if (this.validator) {
            return this.validator.validate(value);//this.validator驗證函數
        }
        throw ('No validator selected');
    };

    return Validator;
});

郵箱驗證模塊(策略類)

define(function () {
    'use strict';

    return {
        validate: function (value) {
            return value.indexOf('@') !== -1;//簡單的郵箱驗證
        }
    };
});

號碼驗證模塊(策略類)

define(function () {
    'use strict';

    return {
        validate: function (value) {
            return (/^[0-9]{11}$/g).test(value);//能夠嚴謹些
        }
    }
});

init模塊

define(function (require) {
    'use strict';

    return {
        init: function () {

            var Strategy = require('strategy/strategy'),
                telValidator = require('strategy/telValidator'),
                emailValidator = require('strategy/emailValidator'),
                validator;

            validator = new Strategy();

            console.log(validator.selectValidator(telValidator).validate(012345678901));

            console.log(validator.selectValidator(emailValidator).validate('test'));
        }

    };

});
相關文章
相關標籤/搜索