zoukankan      html  css  js  c++  java
  • JavaScript设计模式-20.责任链模式

      1 <html>
      2     <head>
      3         <title>javascript高级语法20-责任链模式</title>
      4     </head>
      5     <body>
      6         <script>
      7             /*责任链模式
      8              * 消除发送者与接收者之间的耦合。
      9              * 1.责任链的发送者知道链的入口是谁
     10              * 2.每一个链节点知道自己的下一个节点是谁
     11              * 3.每一个链的传入和传出值是一样的;
     12              */
     13             
     14             //扩展filter函数
     15             Function.prototype.method = function(name,fn){
     16                 this.prototype[name] = fn;
     17                 return this;
     18             }
     19             if(!Array.prototype.filter){
     20                 Array.method("filter",function(fn,obj){
     21                     var scope = this.Obj || window;
     22                     var a = [];
     23                     for(var i=0;i<this.length;i++){
     24                         if(!fn.call(scope,this[i],i,this)){
     25                             continue;
     26                         }
     27                         a.push(this[i]);
     28                     }
     29                     //返回过滤好的数据
     30                     return a;
     31                 })
     32             }
     33             
     34             function demo(){
     35                 //扩展window
     36                 window.setSuccessor = function(after,before){
     37                     after.successor = before;
     38                 }
     39                 //用于拷贝字符串的方法  20*"-" = "------------------"
     40                 window.copyStr = function(num,str){
     41                     var newStr = '';
     42                     for(var i=0;i<num;i++){
     43                         newStr += str;
     44                     }
     45                     return newStr;
     46                 }            
     47                 //转换数组中的对象为字符串
     48                 var showStr = function(arr){
     49                     var newStr = "";
     50                     for(var i=0;i<arr.length;i++){
     51                         newStr += JSON.stringify(arr[i]);
     52                     }
     53                     return newStr;
     54                 }
     55                 
     56                 //书店找书和加书两个需求
     57                 //用户可以输入关键字找书(书号,作者,名称)
     58                 //不同书架管理员管理自己的书籍添加任务            
     59 
     60                 //图书类
     61                 var Book = function(id,name,author,type){
     62                     this.id = id;
     63                     this.name = name;
     64                     this.author = author;
     65                     this.type = type;
     66                 }
     67                 //书店
     68                 var myBookShop = (function(){
     69                     //书架
     70                     var jsBooks = new Array(); //JS书架
     71                     var cBooks = new Array(); //C语言书架
     72                     var pythonBooks = new Array(); //python书架
     73                     //内部类1
     74                     function addJSBook(book){
     75                         if(book.type == "js"){
     76                             jsBooks.push(book);
     77                         }else{
     78                             //负责传递到下一个功能
     79                             addJSBook.successor(book);
     80                         }
     81                     }
     82                     //内部类2
     83                     function addPythonBook(book){
     84                         if(book.type == "py"){
     85                             pythonBooks.push(book);
     86                         }else{
     87                             //负责传递到下一个功能
     88                             addPythonBook.successor(book);
     89                         }
     90                     }
     91                     //内部类3
     92                     function addCBook(book){
     93                         if(book.type == "c"){
     94                             cBooks.push(book);
     95                         }else{
     96                             //负责传递到下一个功能
     97                             addCBook.successor(book);
     98                         }
     99                     }
    100                     //设置责任链
    101                     setSuccessor(addJSBook,addPythonBook);
    102                     setSuccessor(addPythonBook,addCBook);
    103                     
    104                     //查询书籍
    105                     var bookList = null;
    106                     function findBookById(keyword){
    107                         if(!bookList){
    108                             bookList = jsBooks.concat(cBooks).concat(pythonBooks);
    109                         }
    110                         var book = new Array();
    111                         book = bookList.filter(function(book){
    112                             if(book.id.indexOf(keyword) != -1){
    113                                 return true;
    114                             }else{
    115                                 return false;
    116                             }
    117                         });
    118                         //进行链式查询
    119                         return book.concat(findBookById.successor(keyword,book));
    120                     }
    121                     function findBookByName(keyword,book){
    122                         book = bookList.filter(function(book){
    123                             if(book.name.indexOf(keyword) != -1){
    124                                 return true;
    125                             }else{
    126                                 return false;
    127                             }
    128                         });
    129                         return book;
    130                     }
    131                     //规划责任链
    132                     setSuccessor(findBookById,findBookByName);
    133                     
    134                     //真正的图书馆类
    135                     return function(){
    136                         this.addBook = function(book){
    137                             if(book instanceof Book){
    138                                 //因为我知道谁是链的入口。可以这么写
    139                                 addJSBook(book);
    140                             }
    141                         }
    142                         this.findBook = function(keyword){
    143                             return findBookById(keyword);
    144                         }
    145                         this.showBooks = function(){
    146                             //document.write("c语言类图书"+cBooks.toSource()+"<br>")
    147                             //这里的toSource()方法只有火狐支持,所以我全局定义了showStr方法                    
    148                             document.write("js类图书"+showStr(jsBooks)+"<br>")
    149                             document.write("c语言类图书"+showStr(cBooks)+"<br>")
    150                             document.write("Python类图书"+showStr(pythonBooks)+"<br>")
    151                             document.write(copyStr(60,"-")+"<br>");
    152                         }
    153                     }                    
    154                 })();                
    155                 //添加book
    156                 var pb = new myBookShop();
    157                 pb.addBook(new Book("00101","Extjs","zhangsan","js"));
    158                 pb.addBook(new Book("00102","cprimer","jim","js"));
    159                 pb.addBook(new Book("00103","c#","chance","c"));
    160                 pb.addBook(new Book("00201","c++","chance","c"));
    161                 pb.addBook(new Book("00202","python","py","py"));
    162                 pb.addBook(new Book("00203","py实战","杨国正","py"));
    163                 //展示
    164                 pb.showBooks();
    165                 //查询
    166                 document.write(showStr(pb.findBook("02"))+"<br>");
    167                 document.write(copyStr(60,"-")+"<br>");
    168                 document.write(showStr(pb.findBook("c")));            
    169             }
    170             demo();
    171         </script>
    172     </body>
    173 </html>
  • 相关阅读:
    超能英雄第一至四季/全集Heroes迅雷下载
    吸血鬼猎人巴菲第一至八季/全集Buffy迅雷下载
    明星伙伴第一至八季/全集Entourage迅雷下载
    实习医生风云第一至九季/全集Scrubs迅雷下载
    阿里云linux图形界面(centos6)
    linux下mysql的root密码忘记解决方
    wdcp支持两种安装方式
    如何搭建lamp(CentOS7+Apache+MySQL+PHP)环境
    丑女贝蒂第一至四季/全集Ugly Betty迅雷下载
    云服务器 ECS Linux 系统安装图形化桌面 (centos7 ubuntu14)
  • 原文地址:https://www.cnblogs.com/chengyunshen/p/7191827.html
Copyright © 2011-2022 走看看