<html>
<head>
<title>javascript高级语法20-责任链模式</title>
</head>
<body>
<script>
/*责任链模式
* 消除发送者与接收者之间的耦合。
* 1.责任链的发送者知道链的入口是谁
* 2.每一个链节点知道自己的下一个节点是谁
* 3.每一个链的传入和传出值是一样的;
*/ //扩展filter函数
Function.prototype.method = function(name,fn){
this.prototype[name] = fn;
return this;
}
if(!Array.prototype.filter){
Array.method("filter",function(fn,obj){
var scope = this.Obj || 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;
})
} function demo(){
//扩展window
window.setSuccessor = function(after,before){
after.successor = before;
}
//用于拷贝字符串的方法 20*"-" = "------------------"
window.copyStr = function(num,str){
var newStr = '';
for(var i=0;i<num;i++){
newStr += str;
}
return newStr;
}
//转换数组中的对象为字符串
var showStr = function(arr){
var newStr = "";
for(var i=0;i<arr.length;i++){
newStr += JSON.stringify(arr[i]);
}
return newStr;
} //书店找书和加书两个需求
//用户可以输入关键字找书(书号,作者,名称)
//不同书架管理员管理自己的书籍添加任务 //图书类
var Book = function(id,name,author,type){
this.id = id;
this.name = name;
this.author = author;
this.type = type;
}
//书店
var myBookShop = (function(){
//书架
var jsBooks = new Array(); //JS书架
var cBooks = new Array(); //C语言书架
var pythonBooks = new Array(); //python书架
//内部类1
function addJSBook(book){
if(book.type == "js"){
jsBooks.push(book);
}else{
//负责传递到下一个功能
addJSBook.successor(book);
}
}
//内部类2
function addPythonBook(book){
if(book.type == "py"){
pythonBooks.push(book);
}else{
//负责传递到下一个功能
addPythonBook.successor(book);
}
}
//内部类3
function addCBook(book){
if(book.type == "c"){
cBooks.push(book);
}else{
//负责传递到下一个功能
addCBook.successor(book);
}
}
//设置责任链
setSuccessor(addJSBook,addPythonBook);
setSuccessor(addPythonBook,addCBook); //查询书籍
var bookList = null;
function findBookById(keyword){
if(!bookList){
bookList = jsBooks.concat(cBooks).concat(pythonBooks);
}
var book = new Array();
book = bookList.filter(function(book){
if(book.id.indexOf(keyword) != -1){
return true;
}else{
return false;
}
});
//进行链式查询
return book.concat(findBookById.successor(keyword,book));
}
function findBookByName(keyword,book){
book = bookList.filter(function(book){
if(book.name.indexOf(keyword) != -1){
return true;
}else{
return false;
}
});
return book;
}
//规划责任链
setSuccessor(findBookById,findBookByName); //真正的图书馆类
return function(){
this.addBook = function(book){
if(book instanceof Book){
//因为我知道谁是链的入口。可以这么写
addJSBook(book);
}
}
this.findBook = function(keyword){
return findBookById(keyword);
}
this.showBooks = function(){
//document.write("c语言类图书"+cBooks.toSource()+"<br>")
//这里的toSource()方法只有火狐支持,所以我全局定义了showStr方法
document.write("js类图书"+showStr(jsBooks)+"<br>")
document.write("c语言类图书"+showStr(cBooks)+"<br>")
document.write("Python类图书"+showStr(pythonBooks)+"<br>")
document.write(copyStr(60,"-")+"<br>");
}
}
})();
//添加book
var pb = new myBookShop();
pb.addBook(new Book("00101","Extjs","zhangsan","js"));
pb.addBook(new Book("00102","cprimer","jim","js"));
pb.addBook(new Book("00103","c#","chance","c"));
pb.addBook(new Book("00201","c++","chance","c"));
pb.addBook(new Book("00202","python","py","py"));
pb.addBook(new Book("00203","py实战","杨国正","py"));
//展示
pb.showBooks();
//查询
document.write(showStr(pb.findBook("02"))+"<br>");
document.write(copyStr(60,"-")+"<br>");
document.write(showStr(pb.findBook("c")));
}
demo();
</script>
</body>
</html>

JavaScript设计模式-20.责任链模式的更多相关文章

  1. 乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)

    原文:乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 责任链模式(Chain of R ...

  2. php设计模式之责任链模式

    php设计模式之责任链模式 实际问题 你的论坛有举报功能,版主能解决粗口方面的举报,警察能解决严重一点的黄赌毒方面的举报,更严重的反政府的举报就需要由国安局来完成. 职场中每个人都有直属的上级,如果到 ...

  3. python设计模式之责任链模式

    python设计模式之责任链模式 开发一个应用时,多数时候我们都能预先知道哪个方法能处理某个特定请求.然而,情况并非总是如此.例如,想想任意一种广播计算机网络,例如最早的以太网实现.在广播计算机网络中 ...

  4. 【GOF23设计模式】责任链模式

    来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_责任链模式.公文审批.供应链系统的采购审批.异常链.过滤器和拦截器调用过程 package com.test.chainO ...

  5. 详解java设计模式之责任链模式

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt175 从击鼓传花谈起 击鼓传花是一种热闹而又紧张的饮酒游戏.在酒宴上宾客依次 ...

  6. GOF23设计模式之责任链模式(chain of responsibility)

    一.责任链模式概述 将能够处理同一类请求的对象连成一条链,所提交的请求沿着链传递,链上的对象逐个判断是否有能力处理该请求. 如果能则处理,否则传递给链上的下一个对象去处理. 定义责任链 (1)通过链表 ...

  7. 二十四种设计模式:责任链模式(Chain of Responsibility Pattern)

    责任链模式(Chain of Responsibility Pattern) 介绍为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求.将这些对象连成一条链,并沿着这条链传递该请求,直 ...

  8. C#设计模式:责任链模式

    设计模式是面向对象编程的基础,是用于指导程序设计.在实际项目开发过程中,并不是一味将设计模式进行套用,也不是功能设计时大量引入设计模式.应该根据具体需求和要求应用适合的设计模式.设计模式是一个老话题了 ...

  9. Head First设计模式之责任链模式

    一.定义 避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止. 主要解决:职责链上的处理者负责处理请求,客户只需要将请求 ...

随机推荐

  1. Javascript的事件模型和Promise实现

    1. Javascript的运行时模型——事件循环 JS的运行时是个单线程的运行时,它不像其他编程语言,比如C++,Java,C#这些可以进行多线程操作的语言.当它执行一个函数时,它只会一条路走到黑, ...

  2. Javascript设计模式理论与实战:组合模式

    我们平时开发过程中,一定会遇到这种情况:同时处理简单对象和由简单对象组成的复杂对象,这些简单对象和复杂对象会组合成树形结构,在客户端对其处理的时候要保持一致性.比如电商网站中的产品订单,每一张产品订单 ...

  3. 安装、启动consul

    1.下载 从consul官网https://www.consul.io/downloads.html下载 2.解压.配置 将下载的  consul_1.4.4_linux_amd64.zip 解压 t ...

  4. 关于easyui展示慢的Debug

    同事开发的软件系统采用Easyui做的前台界面,当业务变得比较复杂之后,展示效果就变得很慢,于是我开始了原因的排查,现在已经找到了具体的原因,所以拿出来与大家一起分享调试过程. 既然调试的是前端,那么 ...

  5. .Net core 2.0的数据初始化

    在StartUp.cs里面,添加Seed方法 public static void Seed(IApplicationBuilder applicationBuilder) { using (var ...

  6. windows挂载网络盘

    @echo offset filename=%DATE:~0,4%%DATE:~5,2%%DATE:~8,2%set filename="DataBak-%filename%"ne ...

  7. kali linux之取证

    取证简介: CSI:物理取证 指纹.DNA.弹道.血迹 无力取证的理论基础是物质交换原则 数字取证/计算机取证 智能设备.计算机.手机平板.loT.有线及无线信道.数据存储 事件响应调查------黑 ...

  8. jquery中选择器的 html() text() val() attr() 方法的区别与使用方式

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. 干货 | 精选《SQL注入、渗透、反病毒》学习总结集锦给你们~

    学到手的都是本事,如果觉得对你有帮助也欢迎分享给身边的基友们吧! 分享干货,手留余香哦~ 本次“开学季拜师活动”的徒弟们在师父的精心指导下,在短短5天内得到了迅速地成长,以前或当时遇到的问题都能够柳暗 ...

  10. logstash5.5.0同步sql server数据

    注意:jdbc.conf和jdbc.sql文件编码都为ANSI jdbc.conf内容如下: input { stdin { } jdbc { jdbc_connection_string => ...