<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. FlexBox弹性盒布局

    网页布局(layout)是 CSS 的一个重点应用. 布局的传统解决方案,基于盒状模型,依赖 display 属性 + position属性 + float属性.它对于那些特殊布局非常不方便,比如,垂 ...

  2. 寻找最大的K个数(上)

    这是一道很经典的题目,有太多方法了,今天写了两种方法,分别是快排和堆排序 #include <iostream> using namespace std; #define N 25 //初 ...

  3. spring获取webapplicationcontext,applicationcontext几种方法详解(转载)

    转载自  http://www.blogjava.net/Todd/archive/2010/04/22/295112.html 方法一:在初始化时保存ApplicationContext对象 代码: ...

  4. 个人项目-词频统计(语言:C++)

    词频统计 (个人项目) 要求 (1). 实现一个控制台程序,给定一段英文字符串,统计其中各个英文单词(4字符以上含4字符)的出现频率. 附加要求:读入一段文本文件,统计该文本文件中单词的频率. (2) ...

  5. 传智播客.NET视频学习课件

    传智播客.NET视频学习课件访问.NET网站了解更多课程详情http://net.itcast.cn(小提示:为什么本书中超链接打不开?)此套课件是伴随 传智播客.net实况教学视频 (小提示:为什么 ...

  6. redis分布式集群3种架构方案

    集群方案: 1. 主从高可用(该方案就是单实例形式,只是为了保证数据的安全,对于用户数据少,业务的前期可以采用,目前我司缓存架构就是采用该方案) 2. 客户端分片(典型代表:Jedis.自主写分片算法 ...

  7. 浅析C#中的IEquatable<T>接口

    1.引言 首先我们先来看看IEquatable<T>接口的出现解决了什么问题. 我们知道,Object基类的Equals方法存在两个明显的问题.一是缺乏类型安全性,二是对于值类型而言需要装 ...

  8. Spring Boot 学习系列(06)—采用log4j2记录日志

    此文已由作者易国强授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 为什么选择log4j2 log4j2相比于log4j1.x和logback来说,具有更快的执行速度.同时也支 ...

  9. JavaWeb -cookie&session&application

    cookie&session&application总结 Cookie[key-value](不是内置对象必须new): 1. Cookie 是由服务端生成的,在发送给客户端保存 2. ...

  10. Jmeter之线程组详解

    hello,更新几天的分享,线程数现在才分享,感觉怪怪的,原谅我没有考虑到一个顺序问题哈,那里总结好了,我就发那里,先把组件都写完,再来项目实战,希望大家不要责怪哈,内容有写的不详细的,或者我说错了, ...