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>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章