设计模式知识连载(29)---策略模式:

<body>


<h3>设计模式知识连载(29)---策略模式:</h3>
<p>
    将定义的一组算法封装起来,使其相互之间可以替换。封装的算法具有一定独立性,不会随客户端变化而变化。
</p>

<hr>

<form>
    <div>
        <input type="text" name="name" >
        <span></span>
    </div>
    <div>
        <input type="button" name="button">
    </div>
</form>





<script type="text/javascript">


    /**
    *   案例一:促销活动,方式一:初始
    */
    // 价格策略对象
    var PriceStrategy = function() {
        // 内部算法
        var _strategy = {
            // 100返30
            return30 : function(price) {
                // parseInt可通过~~、|等运算符替换,要注意此时price要在
                //【-2147483648,2147483647】之间
                // +price 转化为数字类型
                return +price + parseInt(price / 100) * 30 ;
            },
            // 100返50
            return50 : function(price) {
                return +price + parseInt(price / 100) * 50 ;
            },
            // 9折
            percent90 : function(price) {
                // JavaScript在处理小数乘法有bug,所以运算前转化为整数
                return price * 100 * 90 / 10000 ;
            },
            // 8折
            percent80 : function(price) {
                return price * 100 * 80 / 10000 ;
            },
            // 5折
            percent50 : function(price) {
                return price * 100 * 50 / 10000 ;
            }
        } 

        // 策略算法调用接口
        return function(algorithm, price) {
            // 如果算法存在,则调用算法,否则返回false
            return _strategy[algorithm] && _strategy[algorithm](price) ;
        }
    }
    // 测试实例
    var priceStrategy = PriceStrategy() ;
    var price = priceStrategy('return50', '314.67') ;
    console.log(price) ;


    /**
    *   案例二:jQuery缓冲函数,方式一:初始
    */
    // jquery
    // $('div').animate({width : '200px'}, 100, 'linear') ;
    // $('div').animate({width : '200px'}, 100, 'swing') ;

    // easing.js插件


    /**
    *   案例三:表单验证,方式一:初始
    */
    // 表单正则验证策略对象
    var InputStrategy = function() {
        var _strategy = {
            // 是否为空
            notNull : function(value) {
                return /\s+/.test(value) ? '' : '请输入内容' ; 
            },
            // 是否是一个数字
            number : function(value) {
                return /^[0-9]+(\.[0-9]+)?$/.test(value) ? '' : '请输入数字' ;
            },
            // 是否是本地电话
            phone : function(value) {
                return /^\d{3}\-\d{8}$|^'d{4}\-\d{7}$/.test(value) ? '' : '请输入正确的电话号码格式,如:010-12345678 或 0418-1234567' ;  
            }
        }
        return {
            // 验证接口type 算法 value表单值
            check : function(type, value) {
                // 去除首位空白符
                value = value.replace(/^\s+|\s+$/g, '') ;
                return _strategy[type] ? _strategy[type](value) : '没有该类型的检测方法' ;
            },
            // 添加策略
            addStrategy : function(type, fn) {
                _strategy[type] = fn ;
            }
        }
    } ;
    // 测试实例:
    // 拓展 延伸算法
    var inputStrategy = InputStrategy() ;
    inputStrategy.addStrategy('nickname', function(value) {
        return /^[a-zA-Z]\w{3,7}$/.test(value) ? '' : '请输入4-8位昵称,如:YYHQ' ;
    }) ;
    // 外观模式简化元素的获取
    function $tag(tag, context) {
        context = context || document ;
        return context.getElementsByTagName(tag) ;
    }
    // 提交按钮点击
    $tag('input')[1].onclick = function() {
        // 获取输入框内的内容
        var value = $tag('input')[0].value ;
        // 获取日期格式验证结果
        $tag('span')[0].innerHTML = inputStrategy.check('notNull', value) ;
        $tag('span')[0].innerHTML = inputStrategy.check('nickname', value) ;
    }
</script>   

</body>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值