宝哥软件园

JavaScript设计模式的责任链模式实例分析

编辑:宝哥软件园 来源:互联网 时间:2021-08-27

本文阐述了JavaScript设计模式的责任链模式。分享给大家参考,如下:

介绍

责任链模式是让多个对象有机会处理请求,从而避免请求的发送方和接收方之间的耦合关系。将对象连接成一个链,并沿着这个链传递请求,直到一个对象处理它。

请求之后,从第一个对象开始,链中接收请求的对象要么亲自处理它,要么将其转发给链中的下一个候选对象。提交请求的对象不知道哪个对象将处理它——,也就是说,请求有一个隐式接收器。在运行时,任何候选人都可以响应相应的请求,候选人的数量是任意的。还可以在运行时决定哪些候选人参与链。

图示为:

文本

(1)因为类通常处理接口,我们首先定义一个接口来管理类中的方法,代码是

//定义一个静态方法,实现接口和实现类的直接验证。//静态方法不要写出Interface.prototype,因为是写到接口的原型链。//我们需要把静态函数直接写到类级别。//定义接口类var Interface=function (name,Methods){//name:Interface name if(arguments . length 2){ alert('必须是两个参数')} this.name=namethis . methods=[];//为(var i=0)定义空数组加载函数名;长度;i ){ if(typeof methods[i]!='string'){ alert('函数名必须是字符串类型');} else { this . methods . push(methods[I]);} }};接口。确保实现=函数(对象){if(参数。length 2){抛出新错误('必须至少有2个参数')返回false} for(var I=1;长度;I){ var inter=arguments[I];//如果是接口,则必须是接口类型if(inter.constructor!=接口){抛出新错误('如果是接口类,必须是接口类型');}//确定接口中的所有方法是否都实现了//Traverse函数集分析为(var j=0;jinter . methods . length;j ){ var方法=inter . methods[j];//接口中的所有函数//对象[方法]传入的函数//最后是判断传入的函数是否与接口中使用的函数匹配if(!object[method]| | type of object[method]!='function' ){//实现类中必须有一个与接口中使用的方法名相同的方法名。抛出新的Error('接口中的所有方法都没有在实现类中完全实现')}} }}(2)使用定义书店的接口。

var book=new Interface(' book ',['addBook ',' findBook ',' show books ']);//书店界面(3)定义一个图书类

var Book=function (bNm,bName,bAuthor,bType){ this . bNm=bNm;this.bName=bNamethis.bAuthor=bAuthorthis . BtType=BtType;}(4)书店类=书架类图书

1.在书店增加书架和书籍

Varpcat书店=(function(){//书架var jsBooks=new Array();//js书架varcbook=new array();//c书架var javaBooks=new Array();//java书架//内部类1函数添加js books(book){ if(book . btype==' js '){ js books . push(book);}else { AddJsBooks .后继者(book);} }//内部类2 function addjavabooks(book){ if(book . btype==' Java '){ javabooks . push(book);}else { AddJavaBooks .后继者(book);} }//内部类3函数addc books(book){ if(book . btype==' c '){ cbbooks . push(book);}else { AddCBooks .后继者(book);} } }))()2:扩展设置责任链的方法(在windows上扩展)

//扩展窗口属性window.set后继=function (after,before) {after .后继=before//引用的执行}3:设置责任链并链接每个对象

//设置责任链-串在一起设置继任者(添加jsbooks,添加javaboks);set后继者(AddJavaBooks,AddCBooks);(5)查书方式:按书号、书名

/**********查询书籍* * * * * * * * * */var BookList=null;函数FindBbn(关键字){ //链的头部来初始化参数if(!bookList){ bookList=jsbooks。concat(cBooks).concat(JavaBooks);var book=new Array();book=书单。过滤器(功能(书籍){//对书单进行过滤,过滤的条件为匿名函数if(book.bName.indexOf(关键字)!=-1){返回true } else { return false } });//我要进行链式查询还书。concat(findbn。后继者(关键字));} };函数FindByName(关键字,书){ var book=bookbook=bookList.filter(函数(book){ if(book.bName.indexOf(关键字)!=-1){返回true } else { return false } });还书;}注意,数组的过滤器方法扩展代码如下

功能。原型。方法=函数(名称,fn){ this。原型[名称]=fn;归还这个;}if(!数组。原型。filter){ array。方法(' filter ',function (fn,this obj){ var scope=this obj | | window;var a=[];for(var I=0;长度;i ){ if(!fn.call(范围,这个[i],我,这个));{继续;推(这个[我]);} //返回过滤好数据返回a;})}(6)规划责任链

设置后继者(FindBbn,FindByName);(7)真正的书店类(实现接口的类)

返回函数(){ this。addbook=函数(book){ if(Book的Book实例){ AddJsBooks(Book);//因为我知道谁是链的入口} };this.findBook=函数(关键字){ return FindBbn(关键字);//游泳规划的责任链可以从头到尾的查询若,FindBbn没有则到FindByName中查询}这个。show books=function(){ document。写(' JS类图书jsbooks。to source()“br”);document.write('Java类图书javabooks。to source()“br”);文档。写(' C类图书cbooks。to source()“br”);//自动生产- document.write(cpoyStr(60,'-')' br ');} }注意,在窗户上扩展一个可以自动生成" - "的方法

//扩展一个可以自动生产-的方法window.cpoyStr=function (num,str){ var newStr=' ';for(var I=0;因纽姆;I){ NewStr=str;}返回newStr };(8)使用书店

1:添加书

var Pb=new pcatBookShoppb.addBook(新书(' 00101 ',' JAVA ',' JIM ',' JAVA ');pb.addBook(新书(' 00201 ',' C# ',' world ',' C ');pb.addBook(新书(' 00202 ',' C /C ','你好',' C ');pb.addBook(新书(' 00301 ',' JAVASCRIPT ',' Good ',' JS ');2:对书架上的书进行操作-展示

//展示Pb。显示书籍();document.write(pb.findBook('C ').toSource())为此我们基本上完成了对责任链模式的使用方式的基本学习。

更多关于Java脚本语言相关内容还可查看本站专题: 《javascript面向对象入门教程》 、 《JavaScript错误与调试技巧总结》 、 《JavaScript数据结构与算法技巧总结》 、 《JavaScript遍历算法与技巧总结》 及《JavaScript数学运算用法总结》

希望本文所述对大家Java脚本语言程序设计有所帮助。

更多资讯
游戏推荐
更多+