菜单

深远精晓JavaScript连串(33):设计格局之政策形式详解

2019年7月21日 - JavaScript

介绍

陈设情势定义了算墨家族,分别封装起来,让他们中间可以互相替换,此形式让算法的变化不会影响到利用算法的客户。

正文

在明亮战略方式在此之前,我们先来三个事例,一般情形下,假使大家要做多少合法性验证,比比较多时候都以遵从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 二〇〇九”
};

// 验证给定的值是还是不是只是字母或数字
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”));
}

总结

计策形式定义了一种类算法,从概念上的话,全数的这一个算法都以做一样的事务,只是完成分裂,他能够以一样的办法调用全数的点子,减弱了各类算法类与利用算法类之间的耦合。

从别的多少个局面上的话,单独定义算法类,也惠及了单元测量检验,因为能够经过本人的算法举办单独测量试验。

试行中,不只能够打包算法,也足以用来封装差不离任何类型的法规,是要在条分缕析进度中要求在分化时期使用分歧的政工法则,就足以思量是要政策方式来管理各个变动。

您恐怕感兴趣的篇章:

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图