1.策略模式的定义

策略模式又叫算法簇模式,将一组算法分装到一组具体共同接口的独立类或者对象中,它不影响客户端的情况下发生变化。

通常策略模式适用于当一个应用程序需要实现一种特点的服务和功能,而且该程序有多种实现方式时使用。

一般策略模式包含三个部分

1.环境对象:抽象策略对象的接口或者抽象类的引用。

2.抽象策略对象:一个一个的策略算法实现

3.具体策略对象:分装不同策略的算法(核心)

2.具体策略模式

  我写了一个验证表单的策略算法:

//具体策略对象
var Validate = {
    types:{},            //环境对象
    config:{},           //环境对象
    message:[],
    validate:function(data,callback){
        var i, msg, checker, result_ok,types;

        var flag = 0, msg;
        this.message = [];
        for(i in data){
            flag = 0;
            msg = "";
            types = this.config[i];
            if(!types){
                continue;
            }
            for(var j = 0; j < types.length; j++){
                var type = types[j];

                checker = this.types[type];
                if(!checker){
                    throw {
                        name : "ValidationError",
                        message : "No handler to validate type" + type
                    };
                }
                result_ok = checker.validate(data[i]);
                console.log("result_ok = "+result_ok);
                if(!result_ok){
                    this.message.push(checker.instructions);
                    msg = checker.instructions;
                    flag = 1;
                    break;
                }
            }
            console.log("i = "+i);
            console.log("msg = " + msg);
            if(flag){
                callback(i, msg);
            }
        }
        return this.hasErrors();
    },
    hasErrors:function(){
        return this.message.length !== 0;
    }
}

 策略算法实现:

Validate.types.isEmail = {
    validate:function(emailStr){
        var reg_email=/\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/;
        return reg_email.test(emailStr);
    },
    instructions:"输入邮箱不合法"
}
Validate.types.isPhone = {
    validate:function(phoneStr){
        var reg_phone = /^((13[0-9])|(15[^4])|(18[0-9])|(17[0678])|(14[57]))\d{8}$/;
        return reg_phone.test(phoneStr);
    },
    instructions:"输入电话号码不合法"
}
Validate.types.isNotEmpty = {
    validate:function(str){
        return !!str.replace(/(^\s*)|(\s*$)/g,"");
    },
    instructions:"不能为空"
}

调用方式:

//配置验证信息
Validate.config = {
    name: ['isNotEmpty'],
    // idcard:['isNotEmpty','checkCardId'],
    // mobile:['isNotEmpty','isPhone'],
    channel:['isNotEmpty'],
    company_name:['isNotEmpty'],
    // work_level:['isNotEmpty'],
    // work_years:['isNotEmpty','isNumber'],
    email:['isNotEmpty','isEmail']
};

Validate.message = [];
        Validate.validate(data,function(id,msg){
            $("#"+id).parent('[name=hasError]').addClass('has-error');
            $("#"+id+"_error_tips").text(msg).show();
        });
        if(!Validate.hasErrors()) {
            $.ajax({
                url: that.cgi.addlist,
                type: 'POST',
                dataType: 'json',
                data: data
            }).done(function(result,xhr,status) {
                if(result.retCode === 0){
                    myUtils.showDialog("添加成功",result.retMsg,'type-info',BootstrapDialog.SIZE_SMALL,function(){
                        location.reload();
                    });
                }else if(result.retCode == 10301){
                    location.href="/boss/admin/index.html";
                }else{
                    myUtils.showDialog("添加失败",result.retMsg,'type-danger',BootstrapDialog.SIZE_SMALL);
                }
            }).fail(function(xhr,status) {
                myUtils.showDialog("添加失败","网络繁忙,请稍后再试!",'type-danger',BootstrapDialog.SIZE_SMALL);
            });
        }

 

JS策略模式的更多相关文章

  1. js 策略模式 实现表单验证

    策略模式 简单点说就是:实现目标的方式有很多种,你可以根据自己身情况选一个方法来实现目标. 所以至少有2个对象 .  一个是策略类,一个是环境类(上下文). 然后自己就可以根据上下文选择不同的策略来执 ...

  2. js策略模式vs状态模式

    一.策略模式 1.定义:把一些小的算法,封装起来,使他们之间可以相互替换(把代码的实现和使用分离开来)2.利用策略模式实现小方块缓动 html代码: <div id="containe ...

  3. js --策略模式

    策略模式的定义: 将算法一个个的单独进行封装,并且使他们可以相互替换.此模式让算法的变化不会影响到使用算法的客户. 先回顾一下,我们在做项目的过程中,是不是经常会遇见因为业务逻辑的关系,我们会写好多的 ...

  4. js设计模式(二)---策略模式

    策略模式: 定义: 定义一系列的算法,把他们一个个封装起来,并且是他们可以相互替换 应用场景: 要求实现某一个功能有多种方案可以选择.比如:条条大路通罗马 实现: 场景,绩效为 S的人年终奖有 4倍工 ...

  5. JS设计模式(2)策略模式

    什么是策略模式? 定义:根据不同参数可以命中不同的策略 主要解决:在有多种算法相似的情况下,使用 if...else 所带来的复杂和难以维护. 何时使用:有许多种情况,而区分它们的只是他们直接的行为. ...

  6. js设计模式总结-策略模式

    策略模式 要解决的问题 当解决一个问题有多种方法时,选择使用哪种方法时就少不了要用大量的if语句进行判断,如果将这些方法的实现和判断语句放在一起实现就会产生问题, 比如增加一种的新的方法时,就不得不再 ...

  7. 3.js模式-策略模式

    1. 策略模式 策略模式定义一系列的算法,把它们封装起来,并且可以互相替换. var strategies = { isNonEmpty: function(value,errMsg){ if(val ...

  8. 大熊君说说JS与设计模式之------策略模式Strategy

    一,总体概要 1,笔者浅谈 策略模式,又叫算法簇模式,就是定义了不同的算法,并且之间可以互相替换,此模式让算法的变化独立于使用算法的客户. 策略模式和工厂模式有一定的类似,策略模式相对简单容易理解,并 ...

  9. JS常用的设计模式(9)——策略模式

    策略模式的意义是定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.一个小例子就能让我们一目了然. 回忆下jquery里的animate方法. $( div ).animate( {&quo ...

随机推荐

  1. iOS 10 的坑:新机首次安装 app,请求网络权限“是否允许使用数据”(转)

    症状 iOS 10 之后,陆陆续续地有用户联系我们,说新机第一次安装.第一次启动的时候,app 首屏一片空白,完全没数据.kill 掉重新打开就好了. 一开始以为是用户网络情况不好,但随着越来越多的用 ...

  2. 利用mysql-proxy进行mysql数据库的读写分离

    实验系统:CentOS 6.6_x86_64 实验前提:防火墙和selinux都关闭 实验说明:本实验共有4台主机,IP分配如拓扑 实验软件:mariadb-10.0.20 mysql-proxy-0 ...

  3. Neutron 理解(5):Neutron 是如何向 Nova 虚机分配固定IP地址的 (How Neutron Allocates Fixed IPs to Nova Instance)

    学习 Neutron 系列文章: (1)Neutron 所实现的虚拟化网络 (2)Neutron OpenvSwitch + VLAN 虚拟网络 (3)Neutron OpenvSwitch + GR ...

  4. 图像柔光效果(SoftGlow)的原理及其实现。

    图像柔光效果在很多商业软件中都有实现,比如美图秀秀,光影魔术手等.其能针对原始图像产生一副新的比较平滑感觉光线比较柔和的效果,给人一种朦胧美,如下面几幅图所示:                     ...

  5. 浏览器对于常见HTTP状态码的反应

    在我们向服务器发送一个HTTP请求时,会经历tcp连接(三次握手),发送HTTP请求,服务器返回HTTP响应,浏览器对响应中的状态码进行分析判断,来确定请求是否成功,是否成功得到我们需要的信息. 那么 ...

  6. python爬虫学习(2) —— 爬一下ZOL壁纸

    我喜欢去ZOL找一些动漫壁纸当作桌面,而一张一张保存显然是太慢了. 那怎么办呢,我们尝试使用简单的爬虫来解决这个问题. 0. 本爬虫目标 抓取给定分类「或子分类」网址的内容 分析并得到每个分类下的所有 ...

  7. 数-模(D/A)转换器

    将实现数字信号到模拟信号的转换电流称为数模(D/A)转换器,简称为DAC(Digital - Analog Convert). 目前常见的D/A转化器中,有:权电阻网络D/A转换器.倒T型电阻网络D/ ...

  8. 2016.10.29 NOIP模拟赛 PM 考试整理

    300分的题,只得了第三题的100分. 题目+数据:链接:http://pan.baidu.com/s/1o7P4YXs 密码:4how T1:这道题目存在着诸多的问题: 1.开始的序列是无法消除的( ...

  9. NOIP模拟赛20161007

    %hzwer http://hzwer.com/7602.html 题目名称 “与” 小象涂色 行动!行动! 输入文件 and.in elephant.in move.in 输出文件 and.out ...

  10. java 移位运算符

    java中有三种移位运算符 <<      :     左移运算符,num << 1,相当于num乘以2 >>      :     右移运算符,num >& ...