JavaScript设计模式3---代理设计模式、责任链设计模式、命令设计模式

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>JavaScript设计模式3</title>
    </head>
    <body>
        <script type="text/javascript">


//、代理设计模式:十分实用的模式  买家和卖家之间的  物流  可以理解为一个代理
//
       var me={//买家
           shop:undefined,
           buy:function(){
               console.log("网购"+this.shop.delever());
           }
       }
       var computerShop = {//卖家,computerShop不会自己去实现delever方法,交由代理对象(logistics)实现
       //这样代理对象和卖家进行解耦,并且买家卖家代理三方都可以灵活组合,例如,买家可以选择其他的网店对象,只要其有delever方法    
       //同样,网店也可以灵活的搭配物流商,由具体的代理对象来完成送货功能
       delegate:undefined,
           delever:function(){
               return this.delegate.delever()
           }
       }
       var logistics={//物流 (代理)
 
         delever:function(){
               return "德邦物流正在送货"
           }
       }


       me.shop=computerShop;  //买家可以任选 卖家,这里指定的是computerShop
       computerShop.delegate=logistics;  //给物流代理实现 送货的方法 delever()
       me.buy();//网购  德邦物流正在送货
        </script>
    <script type="text/javascript">


//九、责任链设计模式:用来 连接处理任务的一连串节点,
//使用责任链设计模式可以将复杂的处理过程拆分成多个负责方,并且灵活替换和修改
//开发一处房产,可能需要多个政府部门的批准与检查,每个部门对自己所管辖的范围负责
//举例:实现校验网址功能
    var  typeCheck = {//第一个节点,用来校验传入的数据是否为字符串类型
        nextHandler:undefined,
        handle:function(obj){
            if(typeof obj!=="string"){
                console.log('必须为字符串');
                return false
            }
            if(this.nextHandler!==undefined){
                this.nextHandler.handle(obj)
            }else{
                console.log('校验成功');
                return true
            }
        }
    }
    var emptyCheck = {//第二个节点,校验字符串是否为空字符串
        nextHandler:undefined,
        handle:function(obj){
            if(obj.length===0){
                console.log('字符串不能为空');
                return false
            }
            if(this.nextHandler!==undefined){
                this.nextHandler.handle(obj)
            }else{
                console.log('校验成功');
                return true
            }
        }
    }
    var vaildCheck = {//第三个节点用来进行网址的正则匹配
        nextHandler:undefined,
        handle:function(obj){
            if(!/^(www\.).+(\.com)$/.test(obj)){
                console.log('字符串不合规');
                return false
            }
            if(this.nextHandler!==undefined){
                this.nextHandler.handle(obj)
            }else{
                console.log('校验成功');
                return true
            }
        }
    }
    //链中使用了3个节点来进行校验,链中任何一个节点失败都会中断后面的校验
    typeCheck.nextHandler=emptyCheck;
    emptyCheck.nextHandler=vaildCheck;
    typeCheck.handle('www.ws.com');
    //这种责任链十分容易扩展,如果需要将校验规则改成邮箱,只需要在vaildCheck后面再添加一个邮箱校验的节点即可
    </script>    
    <script type="text/javascript">


//十、命令设计模式:常常用来  进行复杂功能实现与使用的解耦
 //核心:将功能的调用封装成命令,对使用方来说,只需提供正确的命令和参数即可
 //应用广泛,如在使用ajax进行网络请求时,许多第三方的封装都会采用命令模式进行请求配置
     var Calc = {
         perporm:function(p){//调用命令对象的方法
             this.run(p.type,p.params)
         },
         run:function(command,params){
             this[command](...params);
         },
         add:function(a,b){
             console.log('a+b=',a+b)
         },
         sub:function(a,b){
             console.log('a-b=',a-b)
         },
         mul:function(a,b){
             console.log('a*b=',a*b)
         },
         div:function(a,b){
             console.log('a/b=',a/b)
         },
     }
     //创建命令对象,type指定四则运算的类型,params参数用来设计运算的数值
     var p={
         type:'add',
         params:[10,5]
     }
     var p1={
         type:'sub',
         params:[10,5]
     }
     var p2={
         type:'mul',
         params:[10,5]
     }
     var p3={
         type:'div',
         params:[10,5]
     }
  // 使用命令对象    
    Calc.perporm(p);
    Calc.perporm(p1);
    Calc.perporm(p2);
    Calc.perporm(p3)
    </script>    
    </body>
</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值