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. 【转】最牛B的编码套路

    最近,我大量阅读了Steve Yegge的文章.其中有一篇叫“Practicing Programming”(练习编程),写成于2005年,读后令我惊讶不已: 与你所相信的恰恰相反,单纯地每天埋头于工 ...

  2. ffmpeg编译常规大全

    其中有需要CMake的,可以直接sudo apt-get install cmake   编译yasm wget http://www.tortall.net/projects/yasm/releas ...

  3. PhotoShop算法原理解析系列 - 像素化---》碎片。

    接着上一篇文章的热度,继续讲讲一些稍微简单的算法吧. 本文来讲讲碎片算法,先贴几个效果图吧:             这是个破坏性的滤镜,拿美女来说事是因为搞图像的人90%是男人,色色的男人. 关于碎 ...

  4. 一个开关电源传导、辐射处理案例-----Layout环路

    这是一款输入宽电压120-277V  60HZ,输出48V,273mA的电源,使用美芯晟MT7933,采用Buck拓扑结构. 注:在最初的设计中,预留电感L1.L2,CBB电容C1.C2作为传导测试元 ...

  5. C语言中结构体赋值问题的讨论

    今天帮师姐调一个程序的BUG,师姐的程序中有个结构体直接赋值的语句,在我印象中结构体好像是不能直接赋值的,正如数组不能直接赋值那样,我怀疑这个地方有问题,但最后证明并不是这个问题.那么就总结一下C语言 ...

  6. 关于selenium的CI、框架……

    这段时间除了项目测试外,主要在做web自动化的事情,大致总结一下吧,总体的设计模式pageobject+pagefactory+testng的数据驱动,项目用maven来构建,使用jenkins集成, ...

  7. 小讲堂:在线编辑在Mobox文档管理软件中的意义

    今天我们来讨论一下,mobox文档管理软件中的在线编辑的这个功能,相信这个功能是用户在日常的文档维护中非常需要的. 文档管理软件的诸多功能中,在线编辑是一块很重要的功能点,因为在线编辑可以说是提高工作 ...

  8. jdbc java数据库连接 5)CallableStatement 接口

    CallableStatement执行存储过程(也是预编译语言) 首先在sql中执行以下带有输入参数的代码: DELIMITER $ CREATE PROCEDURE pro_findById(IN ...

  9. UINavigationController的创建和相关设置---学习笔记四

    导航控制器 一.设置字体大小,背景等. 二.自定义返回按钮. 三.设置手势. 一.导航中也有个appearance属性,通过它可以设置所有导航的颜色. 二.自定义返回按钮. 1.首先需要知道的是,要把 ...

  10. java多线程系类:JUC线程池:01之线程池架构

    概要 前面分别介绍了"Java多线程基础"."JUC原子类"和"JUC锁".本章介绍JUC的最后一部分的内容--线程池.内容包括:线程池架构 ...