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. Hibernate注解----关联映射注解以及课程总结详解----图片版本

    上一篇,记录了Hibernate注解----类级别注解以及属性注解详解 ,我们这一节主要讲解的是Hibernate注解----关联映射注解以及课程总结详解. 本节的主要内容: 第3章 关联映射注解 3 ...

  2. 令人崩溃的@requestBody乱码一例

    这个问题真是让我心力憔悴了...在客户现场对接就是乱码,StringHttpConverter怎么配置都不行... 场景其实很简单:客户那头post一个http请求,包体是json字符串,我这头spr ...

  3. spring类型自动转换——@InitBinder和Converter

    spring有2种类型转换器,一种是propertyEditor,一种是Converter.虽然都是类型转换,但是还是有细微差别. 所以这里以一个例子的形式来分析一下这2种类型转换的使用场景和差别. ...

  4. POJ2484 A Funny Game[博弈论]

    A Funny Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5401   Accepted: 3381 Desc ...

  5. 第一章 spring核心概念

    一.Spring作用:管理项目中各种业务Bean(service类.Dao类.Action类),实例化类,属性赋值 二.Spring IOC(Inversion of Control )控制反转,也被 ...

  6. 为WebService指定线程池

    通过阅读WebService发布过程的源代码,可以配置自定义的线程池 package org.zln.ws.server;import com.sun.xml.internal.ws.api.Bind ...

  7. echarts在.Net中使用实例(二) 使用ajax动态加载数据

    通过上一篇文章可以知道和echarts参考手册可知,series字段就是用来存储我们显示的数据,所以我们只需要用ajax来获取series的值就可以. option 名称 描述 {color}back ...

  8. TCP/IP、Http、Socket、XMPP-从入门到深入

    TCP/IP.Http.Socket.XMPP-从入门到深入 终极iOS程序猿 2016-12-29 18:27 为了便于大家理解和记忆,我们先对这几个概念进行的介绍,然后分析他们的不同,再进行详细的 ...

  9. Coding 及 git 的工程使用方法

        在过去的两周,同学们除了在学习 C 语言之外,还在学习如何利用 git 将自己的代码上传到 coding 中.也有大量的同学,成功的上传了代码.但是,实际上大部分同学的用法都不合理.这里,以一 ...

  10. java 装饰者模式与继承的区别

    装饰者模式目标 把许多要实现的功能,加载在子类上,类的继承,显得很臃肿,装饰着模式是在不改变原有类文件和使用继承的情况下,通过创建一个包装对象动态地扩展一个对象的功能,相比生成子类更为灵活 装饰者模式 ...