JavaScript責任鏈模式

来源:http://www.cnblogs.com/bfwbfw/archive/2017/10/21/7706318.html
-Advertisement-
Play Games

介紹 責任鏈模式(Chain of responsibility)是使多個對象都有機會處理請求,從而避免請求的發送者和接受者之間的耦合關係。將對象連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個對象處理他為止。 請求以後,從第一個對象開始,鏈中收到請求的對象要麼親自處理它,要麼轉發給鏈中的下一個候選者 ...


介紹

責任鏈模式(Chain of responsibility)是使多個對象都有機會處理請求,從而避免請求的發送者和接受者之間的耦合關係。將對象連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個對象處理他為止。

請求以後,從第一個對象開始,鏈中收到請求的對象要麼親自處理它,要麼轉發給鏈中的下一個候選者。提交請求的對象並不知道哪一個對象將會處理它——也就是該請求有一個隱式的接受者(implicit receiver)。在運行時,任一候選者都可以響應相應的請求,候選者的數目是任意的,也可以在運行時刻決定哪些候選者參與到鏈中。

圖解為:

 

正文

(1)由於類一般是與介面打交道的,為此我們先定義一個規範類中方法的介面,代碼為

 

//定義一個靜態方法來實現介面與實現類的直接檢驗
//靜態方法不要寫出Interface.prototype ,因為這是寫到介面的原型鏈上的
//我們要把靜態的函數直接寫到類層次上
//定義一個介面類
var Interface=function (name,methods) {//name:介面名字
    if(arguments.length<2){
        alert("必須是兩個參數")
    }
    this.name=name;
    this.methods=[];//定義一個空數組裝載函數名
    for(var i=0;i<methods.length;i++){
        if(typeof  methods[i]!="string"){
            alert("函數名必須是字元串類型");
        }else {
            this.methods.push( methods[i]);
        }
    }
};
Interface.ensureImplement=function (object) {
    if(arguments.length<2){
        throw  new Error("參數必須不少於2個")
        return false;
    }
    for(var i=1;i<arguments.length;i++){
        var inter=arguments[i];
        //如果是介面就必須是Interface類型
        if(inter.constructor!=Interface){
            throw  new Error("如果是介面類的話,就必須是Interface類型");
        }
        //判斷介面中的方法是否全部實現
        //遍歷函數集合分析
        for(var j=0;j<inter.methods.length;j++){
            var method=inter.methods[j];//介面中所有函數

            //object[method]傳入的函數
            //最終是判斷傳入的函數是否與介面中所用函數匹配
            if(!object[method]||typeof object[method]!="function" ){//實現類中必須有方法名字與介面中所用方法名相同
                throw  new Error("實現類中沒有完全實現介面中的所有方法")
            }
        }
    }
}

 

(2)使用定義一個書店的介面

var bookShop=new Interface("bookShop",["addBook","findBook","showBooks"]);//書店介面

(3)定義一個書類

var Book=function (bNm,bName,bAuthor,bType) {
    this.bNm=bNm;
    this.bName=bName;
    this.bAuthor=bAuthor;
    this.bType=bType;
}

(4)書店類=書架+圖書

#1:在書店中添加書架和圖書

var  pcatBookShop=(function(){

  //書架
    var jsBooks = new Array();//js書架
    var cBooks = new Array();//c書架
    var javaBooks = new Array();//java書架
     //內部類1
    function AddJsBooks(book) {
        if(book.bType=="Js"){
            jsBooks.push(book);
        }else {
            AddJsBooks.successor(book);
        }
    }
    //內部類2
    function AddJavaBooks(book) {
        if(book.bType=="Java"){
            javaBooks.push(book);
        }else {
            AddJavaBooks.successor(book);
        }
    }
    //內部類3
    function AddCBooks(book) {
        if(book.bType=="C"){
            cBooks.push(book);
        }else {
            AddCBooks.successor(book);
        }
    }

})()

#2:擴展設置責任鏈的方法(擴展在windows上)

//擴展window屬性
window.setSuccessor=function (after,before) {
    after.successor=before;//引用的執行
}

#3:設置責任鏈,將每個對象鏈接起來

 //設置責任鏈-----串起來
    setSuccessor(AddJsBooks,AddJavaBooks);
    setSuccessor(AddJavaBooks,AddCBooks);

(5)查詢圖書的方法:通過圖書編號和圖書圖書名稱

 /**********查詢書籍************/
    var bookList  = null;
    function FindBbn(keyword) {
        //鏈的頭部來初始化參數
        if(!bookList){
            bookList=jsBooks.concat(cBooks).concat(javaBooks);
            var book = new Array();
           book=bookList.filter(function (book) {//對booklist進行過濾,過濾的條件為匿名函數
               if(book.bName.indexOf(keyword)!=-1){
                         return true;
               }else {
                   return false;
               }
           });
            //我要進行鏈式查詢
            return book.concat(FindBbn.successor(keyword));
        }
    };
    function FindByName(keyword,book){
        var book = book;
        book = bookList.filter(function(book){
            if(book.bName.indexOf(keyword) != -1){
                return true;
            }else{
                return false;
            }
        });
        return book;
    }

註意,數組的filter方法擴展代碼如下

Function.prototype.method=function (name,fn) {
    this.prototype[name]=fn;
    return this;
}
if(!Array.prototype.filter){
    Array.method("filter",function (fn,thisObj) {
        var scope=thisObj||window;
        var a=[];
        for(var i=0;i<this.length;i++){
            if(!fn.call(scope,this[i],i,this));{
                continue;
            }
            a.push(this[i]);
        }
        //返回過濾好數據
        return a;
    })
}

(6)規劃責任鏈

  setSuccessor(FindBbn,FindByName);

(7)真正的書店類(實現介面的類)

 return function () {
        this.addBook=function (book) {
            if(book instanceof  Book){
                AddJsBooks(book);//因為我知道誰是鏈的入口
            }
        };
        this.findBook=function (keyword) {
            return FindBbn(keyword);//游泳規劃的責任鏈可以從頭到尾的查詢若,FindBbn沒有則到FindByName中查詢
        }
        this.showBooks=function () {
            document.write("JS類圖書"+jsBooks.toSource()+"<br>");
            document.write("Java類圖書"+javaBooks.toSource()+"<br>");
            document.write("C類圖書"+cBooks.toSource()+"<br>");
            //自動生產----------
            document.write(cpoyStr(60,"-")+"<br>");
        }
    }

註意,在window上擴展一個可以自動生成“---------------”的方法

//擴展一個可以自動生產-----的方法
window.cpoyStr=function (num,str) {
    var newStr="";
    for(var i=0;i<num;i++){
      newStr+=str;
    }
    return newStr;
};

(8)使用書店

#1:添加書

  var pb = new pcatBookShop();
    pb.addBook(new Book("00101","JAVA","JIM","JAVA"));
    pb.addBook(new Book("00201","C#","world","C"));
    pb.addBook(new Book("00202","C++/C","Hello","C"));
    pb.addBook(new Book("00301","JAVASCRIPT","Good","JS"));

#2:對書架上的書進行操作-----展示

//展示
    pb.showBooks();
    document.write(pb.findBook("C").toSource())

為此我們基本上完成了對責任鏈模式的使用方式的基本學習。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、背景圖像顯示: ①background-size:規定背景圖像的大小; 值:像素值、百分比、auto、cover、contain ②background-origin :規定背景圖像的起始位置; 值:padding-box(預設)、content-box、border-box ③backgrou ...
  • 首先,介紹一下自己吧。 我是個普普通通的大一學弟,喜歡WEB前端、手繪、音樂和跆拳道; 曾經有一段灰濛蒙的日子,但是不想再提了; 命運如此,我來到了河北科技大學; 我本身是一個少言寡語的人,所以也沒太多朋友; 喜歡一個人在下雨天喝著咖啡,看窗外過往人流; 希望遇到一個拼搏的團隊,希望有個熱心的老師, ...
  • 一、介紹 TypeScript是JavaScript的超集,擴展了JavaScript的語法,也意味著他支持所有的 JavaScript 語法 它支持ES6規範 強大的IDE支持 是Angular2的開發語言 二、搭建TypeScript開發環境 compiler(編譯器) 作用:能將TypeScr ...
  • “時鐘展示項目”說明文檔(文檔尾部附有相應代碼) 一、最終效果展示: 二、項目亮點 1.代碼結構清晰明瞭 2.可以實時動態顯示當前時間與當前日期 3.界面簡潔、美觀、大方 4.提高瀏覽器相容性 三、知識點彙總: jQuery、原生javascript、css3、h5 四、重難點解釋 1.各個指針的旋 ...
  • 為什麼是03,因為我是從今天才意識到輸出也是學習過程中很重要的一環,所以從今天開始,我會把每天學到的新知識記錄下來,溫故而知新。 重申下,每篇文章都是我當天學習的記錄,因本人是小白,水平有限,難免出現紕漏,後續會及時改正。歡迎各位指出錯誤!!! 1,首先來看看overflow的5個基本屬性: 1-1 ...
  • //數據結構對比 增查改刪 { //map、set和Object let item = {t:1}; let map = new Map(); let set = new Set(); let obj = {}; //增 map.set('t',1); set.add(item); obj['t']... ...
  • //數據結構對比 增查改刪 { //map和array對比 let map = new Map(); let array = []; //增 map.set('t',1); array.push({t:1}); console.info('map-array',map,array) //{"t"=>... ...
  • ElementUI的表格要求的數據類型為字典數組。我使用了python3寫後端,那麼從資料庫取數據時添加一行cursorclass=pymysql.cursors.DictCursor即可。取出後我將其存入redis資料庫方便之後取用。取用時使用eval()函數再傳到前端即可。 前端放置Pagina ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...