JavaScript设计模式-20.责任链模式
<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.责任链模式的更多相关文章
- 乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern)
原文:乐在其中设计模式(C#) - 责任链模式(Chain of Responsibility Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 责任链模式(Chain of R ...
- php设计模式之责任链模式
php设计模式之责任链模式 实际问题 你的论坛有举报功能,版主能解决粗口方面的举报,警察能解决严重一点的黄赌毒方面的举报,更严重的反政府的举报就需要由国安局来完成. 职场中每个人都有直属的上级,如果到 ...
- python设计模式之责任链模式
python设计模式之责任链模式 开发一个应用时,多数时候我们都能预先知道哪个方法能处理某个特定请求.然而,情况并非总是如此.例如,想想任意一种广播计算机网络,例如最早的以太网实现.在广播计算机网络中 ...
- 【GOF23设计模式】责任链模式
来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_责任链模式.公文审批.供应链系统的采购审批.异常链.过滤器和拦截器调用过程 package com.test.chainO ...
- 详解java设计模式之责任链模式
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt175 从击鼓传花谈起 击鼓传花是一种热闹而又紧张的饮酒游戏.在酒宴上宾客依次 ...
- GOF23设计模式之责任链模式(chain of responsibility)
一.责任链模式概述 将能够处理同一类请求的对象连成一条链,所提交的请求沿着链传递,链上的对象逐个判断是否有能力处理该请求. 如果能则处理,否则传递给链上的下一个对象去处理. 定义责任链 (1)通过链表 ...
- 二十四种设计模式:责任链模式(Chain of Responsibility Pattern)
责任链模式(Chain of Responsibility Pattern) 介绍为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求.将这些对象连成一条链,并沿着这条链传递该请求,直 ...
- C#设计模式:责任链模式
设计模式是面向对象编程的基础,是用于指导程序设计.在实际项目开发过程中,并不是一味将设计模式进行套用,也不是功能设计时大量引入设计模式.应该根据具体需求和要求应用适合的设计模式.设计模式是一个老话题了 ...
- Head First设计模式之责任链模式
一.定义 避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止. 主要解决:职责链上的处理者负责处理请求,客户只需要将请求 ...
随机推荐
- 网络排错与网络命令的理解ping-traceroute-host(nslookup)-tcpdump获取对方的mac
1. 虚拟机中NAT架构的网络结构中, 虚拟网卡VMnet8(192.168.134.1)是连接宿主主机. 用虚拟网段中主机(192.168.134.133),ping VMnet8 为什么没有响 ...
- 层层递进Struts1(五)之处理流程
这篇博客我们深入Struts框架执行部分源码,从ActionServlet的process函数开始,看一下其内在的执行过程. 流程图 以下流程图展示的是ActionServlet和RequestPro ...
- [label][转载][JavaSript]querySelectorAll 方法相比 getElementsBy 系列方法有什么区别?
轉載出處: http://www.zhihu.com/question/24702250 querySelectorAll 相比下面这些方法有什么区别? getElementsByTagName g ...
- 咏南LINUX中间件
咏南LINUX中间件 什么是跨平台? DELPHI跨平台已经不是停留在理论,而是可以实用了. 同一套中间件既能在WINDOWS服务器上面部署,又可以在LINUX服务器上面部署. 而做到这一切,只需要一 ...
- Math类的三个方法比较: floor() ceil() round()
public class Test { public static void main(String[] args) { double d1 = 3.4, d2 = 3.6; //正数 double ...
- angular响应式表单 - 状态字段
用于表单验证的过程: touched,untoched pristine,dirty pending
- 关于类属性值校验的一点记录 【知识点Attribute】
好久没有进来了,之前励志坚持写博客,记录自己在做代码搬运工这段历程中点滴,可是仅仅只坚持了几天,就放弃了!果然是,世上无难事,只要肯放弃!哈哈……闲话不多说,开始进入正题,给自己留点笔记,避免将来老了 ...
- VUE环境安装和创建项目
1.首先要安装nodejs和npm. 下载nodejs安装,下载地址:https://nodejs.org/en/ 安装很简单一路next即可. 安装完成后可以在cmd窗口输入node -v 和 np ...
- asp.net mvc 3 linq实现数据的增、删、改、查、
添加数据 定义一个对象: public class Student { public int id{get; set;} public string Name{get;set;} public str ...
- Impala源码之资源管理与资源隔离
本文由 网易云发布. 前言 Impala是一个MPP架构的查询系统,为了做到平台化服务,首先需要考虑就是如何做到资源隔离,多个产品之间尽可能小的甚至毫无影响.对于这种需求,最好的隔离方案无疑是物理机 ...