设计模式——策略模式

227 阅读2分钟

在处理未知事情之前,我们可以会有多种假设,并生成不同的方案,针对事情不同的情境我们采用对的方案,这就是策略模式

  1. 定义

定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。

  1. 核心

将算法的使用和算法的实现分离开来。

一个基于策略模式的程序至少由两部分组成:

第一个部分是一组策略类,策略类封装了具体的算法,并负责具体的计算过程。

第二个部分是环境类Context,Context接受客户的请求,随后把请求委托给某一个策略类。要做到这点,说明Context 中要维持对某个策略对象的引用

  1. 实现

策略模式可以用于组合一系列算法,也可用于组合一系列业务规则

在组合业务规则方面,比较经典的是表单的验证方法。这里列出比较关键的部分

 // 错误提示
    var errorMsgs = {
        default: "输入数据格式不正确",
        minLength: "输入数据长度不足",
        isNumber: "请输入数字",
        require: "内容不为空"
    }

    // 校验器
    function Validator() {
        // 规则集合
        this.rules = {
            minLength: function (v1, v2, errorMsg) {
                if (v1.length < v2) {
                    return errorMsg || errorMsgs['minLength']
                }
            },
            isNumber: function (v1, v2, errorMsg) {
                if (!/\d+/.test(v1) && v2 == true) {
                    return errorMsg || errorMsgs['isNumber'];
                }
            },
            required: function (v1, v2, errorMsg) {
                if (v1 === '' && v2 === true) {
                    return errorMsg || errorMsgs['required'];
                }
            }
        }
    };
    // 原型重定向
    Validator.prototype = {
        constructor: Validator,
        // 添加校验规则
        test: function (value, rules) {
            for (const rule of rules) {
                if (rule.isNumber !== undefined) {
                    let res = this.rules["isNumber"](value, rule.isNumber, rule.message)
                    if (res) {
                        return res
                    }
                }
                if (rule.required !== undefined) {
                    let res = this.rules["required"](value, rule.required, rule.message)
                    if (res) {
                        return res
                    }
                }
                if (rule.minLength) {
                    let res = this.rules["minLength"](value, rule.minLength, rule.message)
                    if (res) {
                        return res
                    }

                }
            }
        },

    };
    var validate = new Validator();
    console.log(validate.test('ccc', [{
        isNumber: true,
        message: "只能为数字"
    }]));
    console.log(validate.test('12', [{
        required: true,
        message: "不能为空"
    }, {
        minLength: 5,
        message: "最少5位"
    }]));
    console.log(validate.test('123', [{
        minLength: 5
    }]));
    console.log(validate.test('12345', [{
        minLength: 5
    }]));

来源