javascript设计模式之策略模式

数据验证之简易方式

// 举例 常见的验证表单字段经常是if else 或者 switch case
var validater = {
    validate: function (value, type) {
        switch (type) {
            case ‘isNonEmpty ‘:
                break; // NonEmpty 验证结果
            case ‘isNumber ‘:
                break; // Number 验证结果
            case ‘isAlphaNum ‘:
                break; // AlphaNum 验证结果
            default:
                return true;
        }
    }
};

// 测试
alert(validater.validate("123", "isNonEmpty"));

数据验证之策略模式

// source: http://jsfiddle.net/ganksolo/4ezZ4/

/*
 * 策略模式
 * 策略模式定义了一系列算法,这些算法都是做相同的事情,只是实现不同
 * 减少了算法类与使用算法类之间的耦合
*/

/*
 * 算法封装 -> 需要验证的数据 -> 根据数据配置验证器规则(策略模式的体现)
 * 1.把验证的算法分别封装起来,让统一的验证器(validator)来分别处理
 * 2.开发者只需提供需要验证的表单数据(可以是一个js对象)算法
 * 3.开发者根据需要验证的数据(这里指表单数据),设置验证器有效规则的可接受规则(为了使验证器知道最好的策略)
*/
var validator = {

    // 所有用于验证规则的处理程序
    arithmetic: {},

    // 错误消息
    messages: [],

    // 当前验证的配置
    config: {},

    // 接口方法 传入的参数是 key => value对
    validate: function (data) {
        var i, msg, type, checker, result_ok;

        // 重置所有消息
        this.messages = [];

        for (i in data) {
            if (data.hasOwnProperty(i)) {

                // 根据key查询是否有存在的验证规则
                type = this.config[i];

                // 获取验证规则的验证处理程序
                checker = this.arithmetic[type];

                // 如果验证规则不存在,则不处理
                if (!type) {
                    continue;
                }

                // 如果验证处理程序不存在,抛出异常
                if (!checker) {
                    throw {
                        name: "ValidationError",
                        message: "没有处理程序来验证类型 " + type
                    }
                }

                // 验证结果
                result_ok = checker.validate(data[i]);

                if (!result_ok) {
                    msg = "无效值为 " + i + " ," + checker.instructions;
                    this.messages.push(msg);
                }
            }
        }

        return !this.hasErrors();  // 验证通过了吗
    },

    // 帮助程序
    hasErrors: function () {
        return this.messages.length !== 0;
    }
};

// 算法封装
validator.arithmetic = {
    // 空值检测
    isNonEmpty: {
        validate: function (value) {
            return value !== "";
        },
        instructions: "传入的值不能为空!"
    },

    // 检测汉字
    isZhCn: {
        validate: function (value) {
            return /^[\u4e00-\u9fa5]+$/.test(value);
        },
        instructions: "请输入汉字!"
    },

    // 检测手机号码
    isTel: {
        validate: function (value) {
            return /1\d{10}/.test(value);
        },
        instructions: "请输入正确的手机号码!"
    },

    // 检测改值只能包含字母和数字
    isAlphaNum: {
        validate: function (value) {
            return /[a-z0-9]/i.test(value);
        },
        instructions: "传入的值只能包含字母和数字,不能包含特殊字符"
    }
};

// 需要验证的数据
var data = {
    name: "name",
    tel: 1555
};

// 配置验证器规则
validator.config = {
    name: "isZhCn",
    tel: "isTel"
};

// 测试
validator.validate(data);

(function () {
    if (validator.hasErrors()) {

        //console.log(validator.messages.join("\n"));
        if (validator.messages.join("").indexOf("name") !== -1) {
            console.log("请输入汉字");
            return false;
        }

        if (validator.messages.join("").indexOf("tel") !== -1) {
            console.log("请输入手机号码");
            return false;
        }
    }
})();
时间: 2024-08-01 22:47:51

javascript设计模式之策略模式的相关文章

JavaScript设计模式之策略模式(学习笔记)

在网上搜索“为什么MVC不是一种设计模式呢?”其中有解答:MVC其实是三个经典设计模式的演变:观察者模式(Observer).策略模式(Strategy).组合模式(Composite).所以我今天选择学习策略模式. 策略模式:定义了一系列家族算法,并对每一种算法单独封装起来,让算法之间可以相互替换,独立于使用算法的客户. 通常我并不会记得“牛顿第一定律”的具体内容,所以我也难保证我会对这个定义记得多久……用FE经常见到的东西来举个例子说明一下: $("div").animation(

JavaScript版本的策略模式

俗话说,条条大路通罗马.在美剧<越狱>中,主角Michael Scofield就设计了两条越狱的道路.这两条道路都可以到达靠近监狱外墙的医务室. 同样,在现实中,很多时候也有多种途径到达同一个目的地.比如我们要去某个地方旅游,可以根据具体的实际情况来选择出行的线路. 如果没有时间但是不在乎钱,可以选择坐飞机. 如果没有钱,可以选择坐大巴或者火车. 如果再穷一点,可以选择骑自行车. 在程序设计中,我们也常常遇到类似的情况,要实现某一个功能有多种方案可以选择.比如一个压缩文件的程序,既可以选择zi

设计模式之策略模式(Strategy)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

理解javascript中的策略模式

策略模式的定义是:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换. 使用策略模式的优点如下: 优点:1. 策略模式利用组合,委托等技术和思想,有效的避免很多if条件语句. 2. 策略模式提供了开放-封闭原则,使代码更容易理解和扩展. 3. 策略模式中的代码可以复用. 一:使用策略模式计算奖金: 下面的demo是我在书上看到的,但是没有关系,我们只是来理解下策略模式的使用而已,我们可以使用策略模式来计算奖金问题: 比如公司的年终奖是根据员工的工资和绩效来考核的,绩效为A的人,年终奖

Head First 设计模式之一 策略模式

策略模式 定义 策略模式定义了算法族,分别封装起来,让他们之间可以相互转换,此模式让算法的变化独立于使用算法的客户. 实例 上面的定义看起来说的不太清楚,记定义无意义,理解策略模式还是要看书中的鸭子例子.假设设计一个模拟鸭子的游戏,鸭子的种类有很多,有红头鸭.绿头鸭等等,鸭子可以划水,可以呱嘎叫.在这个模拟游戏的实现上,自然会想到用继承的方法,定义一个鸭子基类,具体的鸭子类型继承自鸭子基类.如下图所示 所有鸭子都会飞.呱呱叫和游泳,这些功能由基类来实现,display函数用来输出鸭子实例的类型,

大话设计模式_策略模式(Java代码)

策略模式:定义算法家族,分别封装,让它们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户 简单描述:一个父类,多个子类实现具体方法.一个Context类持有父类的引用(使用子类实例化此引用),客户端代码只需要与此Context类交互即可 大话设计模式中的截图: 例子代码: 策略类: 1 package com.longsheng.strategy; 2 3 public abstract class Strategy { 4 5 public abstract double getR

设计模式之策略模式20170720

行为型设计模式之策略模式: 一.含义 策略模式是一种比较简单的模式,也叫做政策模式,其定义如下: 定义一组算法(可抽象出接口),将每个算法都封装起来,并且使它们之间可以互换(定义一个类实现封装与算法切换) 二.代码说明 1.主要有两个角色 1)Context封装角色 它也叫做上下文角色,起承上启下封装作用,屏蔽高层模块对策略,算法的直接访问,封装可能存在的变化. 2)策略角色 该类含有具体的算法 2.在用C实现过程中也是参考这种思想,以压缩,解压算法举例,具体实现如下: 1)策略模式使用场景

&lt;二&gt;读&lt;&lt;大话设计模式&gt;&gt;之策略模式

又和大家见面了,能够坚持写出第二篇文章真不错,好好加油. <<大话设计模式>>讲解策略模式是以商场收银软件程序开头的,那么问题来了,哪家商场收银软件强,开玩笑了.读过上篇文章<<简单工厂模式>>的知道,它有两个缺点:1.客户端依赖两个类,耦合性高:2.如果算法过多则需要写很多类.解决上面问题的就是策略模式了. 策略模式:它定义了算法家族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户. 商场收银软件:单价*打折算法=售价.

设计模式之策略模式C++实现

策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户. 策略模式UML图如下: 举例: 游泳池中有不同种类的鸭子,有绿头鸭,红头鸭,橡皮鸭,木头鸭等.不同鸭子的特征或行为不同.绿头鸭(MallardDuck)可以叫声是"quack",会飞:橡皮鸭叫声是"queak",不会飞:木头鸭不会叫,也不会飞.利用面向对象原理来设计来泳池中的各种鸭.要求:1.可扩展性好,当有新鸭加入时或鸭的行为有变动时,不用大量改动代码:2.复用性