1

一个基于策略模式的程序至少由两部分组成。
第一个部分是一组策略类,策略类封装了具体的算法,并负责具体的计算过程。第二个部分是环境类Context,Context接受客户的请求,随后把请求委托给某一个策略类。

优点:

  • 策略模式利用组合、委托和多态等技术和思想,可以有效地避免多重条件选择语句。

  • 策略模式提供了对开放—封闭原则的完美支持,将算法封装在独立的strategy中,使得它们易于切换,易于理解,易于扩展。

  • 策略模式中的算法也可以复用在系统的其他地方,从而避免许多重复的复制粘贴工作。

  • 在策略模式中利用组合和委托来让Context拥有执行算法的能力,这也是继承的一种更轻便的替代方案。

缺点:

  • 首先,使用策略模式会在程序中增加许多策略类或者策略对象,但实际上这比把它们负责的逻辑堆砌在Context中要好。

  • 其次,要使用策略模式,必须了解所有的strategy,必须了解各个strategy之间的不同点,这样才能选择一个合适的strategy。比如,我们要选择一种合适的旅游出行路线,必须先了解选择飞机、火车、自行车等方案的细节。此时strategy要向客户暴露它的所有实现,这是违反最少知识原则的。

策略模块:(环境类)

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'));
        }

    };

});

wee911
192 声望2 粉丝

下一篇 »
判断数据类型