zoukankan      html  css  js  c++  java
  • 策略模式

    策略模式的定义:定义⼀系列的算法,把他们⼀个个封装起来,并且使他们可以相互替换。
     
    策略模式的⽬的就是将算法的使⽤算法的实现分离开来。
     
    ⼀个基于策略模式的程序⾄少由两部分组成。第⼀个部分是⼀组策略类(可变),策略类封装了具体的
    算法,并负责具体的计算过程。第⼆个部分是环境类Context(不变),Context接受客户的请求,随后
    将请求委托给某⼀个策略类。要做到这⼀点,说明Context中要维持对某个策略对象的引⽤
     
    举个栗⼦
        奖⾦计算,绩效为 S 的⼈年 终奖有 4 倍⼯资,绩效为 A 的⼈年终奖有 3 倍⼯资,⽽绩效为 B 的⼈年终
        奖是 2 倍⼯资
    var calculateBonus = function( performanceLevel, salary ){
    if ( performanceLevel === 'S' ){
    return salary * 4;
    }
    if ( performanceLevel === 'A' ){
    return salary * 3;
    }
    if ( performanceLevel === 'B' ){
    return salary * 2;
    }
    };
    calculateBonus( 'B', 20000 ); // 输出:40000
    calculateBonus( 'S', 6000 ); // 输出:24000
    使⽤策略模式
    var strategies = {
    "S": function( salary ){
    return salary * 4;
    },
    "A": function( salary ){
    return salary * 3;
    },
    "B": function( salary ){
    return salary * 2;
    }
    };
    var calculateBonus = function( level, salary ){
    return strategies[ level ]( salary );
    };
    console.log( calculateBonus( 'S', 20000 ) );// 输出:80000
    console.log( calculateBonus( 'A', 10000 ) );// 输出:30000
    表单校验
    // 正常写法
    var registerForm = document.getElementById( 'registerForm' );
    registerForm.onsubmit = function(){
    if ( registerForm.userName.value === '' ){
    alert ( '⽤户名不能为空' );
    return false;
    }
    if ( registerForm.password.value.length < 6 ){
    alert ( '密码⻓度不能少于 6 位' );
    return false;
    }
    if ( !/(^1[3|5|8][0-9]{9}$)/.test( registerForm.phoneNumber.value ) ){
    alert ( '⼿机号码格式不正确' );
    return false;
    }
    }
     
    使⽤策略模式
    var strategies = {
    isNonEmpty: function( value, errorMsg ){
    if ( value === '' ){
    return errorMsg ;
    }
    },
    minLength: function( value, length, errorMsg ){
    if ( value.length < length ){
    return errorMsg;
    }
    },
    isMobile: function( value, errorMsg ){ // ⼿机号码格式
    if ( !/(^1[3|5|8][0-9]{9}$)/.test( value ) ){
    return errorMsg;
    }
    }
    };
     
    var Validator = function(){
    this.cache = []; // 保存校验规则
    };
    Validator.prototype.add = function(
    var ary = rule.split( ':' );
    this.cache.push(function(){ //
    var strategy = ary.shift();
    ary.unshift( dom.value );
    ary.push( errorMsg ); //
    return strategies[strategy].apply(dom, ary);
    });
    };
    Validator.prototype.start = function(){
    for ( var i = 0, validatorFunc; validatorFunc = this.cache[ i++ ]; ){
    var msg = validatorFunc(); // 开始校验,并取得校验后的返回信息
    if ( msg ){ // 如果有确切的返回值,说明校验没有通过
    return msg;
    }
    }
    };
    var validataFunc = function(){
    var validator = new Validator(); // 创建⼀个 validator 对象
    /***************添加⼀些校验规则****************/
    validator.add( registerForm.userName, 'isNonEmpty', '⽤户名不能为空' );
    validator.add( registerForm.password, 'minLength:6', '密码⻓度不能少于 6位');
    validator.add( registerForm.phoneNumber, 'isMobile', '⼿机号码格式不正确' );
    var errorMsg = validator.start(); // 获得校验结果
    return errorMsg; // 返回校验结果
    }
    var registerForm = document.getElementById( 'registerForm' );
    registerForm.onsubmit = function(){
    var errorMsg = validataFunc(); // 如果 errorMsg 有确切的返回值,说明未通过校验
    if ( errorMsg ){
    alert ( errorMsg );
    return false; // 阻⽌表单提交
    }
    };
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    每天一个Linux命令(03):du命令
    每天一个linux命令(02):route命令
    Ubuntu相关配置
    kvm 虚拟机XML文件
    virtio,macvtap,sriov
    dns配置文件
    Bug预防体系(上千bug分析后总结的最佳实践)
    python-函数
    python实用脚本集
    深入浅出QOS详解(转)
  • 原文地址:https://www.cnblogs.com/zhouyideboke/p/13404700.html
Copyright © 2011-2022 走看看