首頁 > web前端 > js教程 > 學習JavaScript設計模式之責任鏈模式_javascript技巧

學習JavaScript設計模式之責任鏈模式_javascript技巧

WBOY
發布: 2016-05-16 15:19:30
原創
1292 人瀏覽過

一、定義

責任鏈模式:使多個物件都有機會處理請求,從而避免請求的發送者和接受者之間的耦合關係,將這些物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個物件處理它為止。

二、範例

  • 假設這麼一個場景:
  • 我們負責一個販賣手機的電商網站,經過分別繳納500元定金和200元定金的兩輪預定後,到了正式購買階段。針對預定用戶實施優惠,支付過500元訂金的用戶會收到100元的商城優惠券,支付過200元訂金的用戶會收到50元的商城優惠券,沒有支付訂金的用戶歸為普通購買,且在庫存有限的情況下不一定保證買到。
/* 传统方式实现 */
// orderType:[1:500, 2:200, 3:普通],isPaid:true/false,stock:库存量
var order = function(orderType, isPaid, stock) {
  if(orderType === 1) {
    if(isPaid) {
      console.log("500元定金预购,得到100优惠券");
    } else {
      if(stock > 0) {
        console.log("普通购买,无优惠券");
      }else {
        console.log("库存不足");
      }
    }
  }else if(orderType === 2) {
    if(isPaid) {
      console.log("200元定金预购,得到50优惠券");
    } else {
      if(stock > 0) {
        console.log("普通购买,无优惠券");
      }else {
        console.log("库存不足");
      }
    }
  }else if(orderType === 2) {
    if(stock > 0) {
      console.log("普通购买,无优惠券");
    }else {
      console.log("库存不足");
    }
  }
}

order(1, true, 500);

/*职责链 */
var order500 = function(orderType, isPaid, stock) {
  if(orderType === 1 && isPaid === true) {
    console.log("500元定金预购,得到100优惠券");
  }else {
    return "nextSuccessor";
  }
};

var order200 = function(orderType, isPaid, stock) {
  if(orderType === 2 && isPaid === true) {
    console.log("200元定金预购,得到50优惠券");
  }else {
    return "nextSuccessor";
  }
};

var orderNormal = function(orderType, isPaid, stock) {
  if(stock > 0) {
    console.log("普通购买,无优惠券");
  }else {
    console.log("库存不足");
  }
};

Function.prototype.after = function(fn) {
  var self = this;
  return function() {
    var ret = self.apply(this, arguments);
    if(ret === "nextSuccessor") {
      return fn.apply(this, arguments);
    }
    return ret;
  };
}

var order = order500.after(order200).after(orderNormal);
order(1, true, 10);

登入後複製

優點:解耦了請求傳送者和N個接受者之間的複雜關係。
弊端:不能保證某個請求一定會被鏈中的節點處理。

三、範例:檔案上傳物件

範例2:用責任鏈模式取得檔案上傳物件
PS:對比《學習JavaScript設計模式之迭代器模式》

function getActiveUploadObj() {
  try{
    return new ActiveObject("TXFTNActiveX.FTNUpload"); // IE上传控件
  }catch(e) {
    return "nextSuccessor";
  }
}

function getFlashUploadObj() {
  if(supportFlash().f === 1) {  // supportFlash见《JavaScript设计模式--迭代器模式》
    var str = '<object type="application/x-shockwave-flash"></object>';
    return $(str).appendTo($("body"));
  }
  return "nextSuccessor";
}

function getFormUploadObj() {
  var str = '<input name="file" type="file" class="ui-file" />';
  return $(str).appendTo($("body"));
}

var getUploadObj = getActiveUploadObj.after(getFlashUploadObj).after(getFormUploadObj);

console.log(getUploadObj());

登入後複製

無論是作用域鏈、原型鏈、或DOM節點中的事件冒泡,我們都能從中找到職責鏈的影子。

以上就是本文的全部內容,希望本文所述對大家學習javascript程式設計有所幫助。 。

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板