博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript责任链模式
阅读量:7043 次
发布时间:2019-06-28

本文共 4177 字,大约阅读时间需要 13 分钟。

介绍

责任链模式(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

 

(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

(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()+"
"); document.write("Java类图书"+javaBooks.toSource()+"
"); document.write("C类图书"+cBooks.toSource()+"
"); //自动生产---------- document.write(cpoyStr(60,"-")+"
"); } }

注意,在window上扩展一个可以自动生成“---------------”的方法

//扩展一个可以自动生产-----的方法window.cpoyStr=function (num,str) {    var newStr="";    for(var i=0;i

(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())

为此我们基本上完成了对责任链模式的使用方式的基本学习。

 

posted on
2017-10-21 21:35 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/wfaceboss/p/7706318.html

你可能感兴趣的文章
CSS自定义变量属性——像less,sass那样在css中使用变量(译)
查看>>
在 Android 上离线导览模型
查看>>
深入css之去除inline-block元素之间的多余间隙
查看>>
关于cronjob的用法
查看>>
对于fork()用法的初步探讨
查看>>
Javascript 数组循环遍历之forEach
查看>>
HTML & CSS之小白初入江湖
查看>>
写一个简单的webserver
查看>>
通过 InnoSetup 美化安装界面
查看>>
一次不怎么愉快的滴滴面试经历
查看>>
Android的资源管理器的创建过程
查看>>
php验证身份证函数
查看>>
[使用 Weex 和 Vue 开发原生应用] 1 如何配置开发环境
查看>>
红帽发布 Ansible Tower 3.4:在混合云中实践DevOps更便捷
查看>>
Linus 发文宣布Linux Kernel 5.0 正式发布
查看>>
定制你的敏捷方法:以结果为导向
查看>>
关于Visual Studio 2019的前期详情
查看>>
PWA即将推向所有Chrome平台
查看>>
官宣!微软宣布桌面版 Edge将基于Chromium进行开发\n
查看>>
运用供应链管理实现更快速、更高质量的交付
查看>>