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设计模式之责任链模式
一.定义 避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止. 主要解决:职责链上的处理者负责处理请求,客户只需要将请求 ...
随机推荐
- tomcat下manager配置
1 安装Tomcat前需要先安装JDK.安装Tomcat后测试Tomcat成功安装. Tomcat Manager是Tomcat自带的.用于对Tomcat自身以及部署在Tomcat上的应用进行管理的w ...
- 在Github注册账户
https://github.com/JasonHaoz
- java 封装返回json数据
做的东西,一直是用easyui的,和后台的交互数据都是json格式的. 今天想要单独弄一个json数据返回给前台,其实是比较简单的问题,json接触不多,记录一下. 代码: public static ...
- 原创:MVC 5 实例教程(MvcMovieStore 新概念版:mvc5.0,EF6.01) - 3、创建项目
说明:MvcMovieStore项目已经发布上线,想了解最新版本功能请登录 MVC 影视(MvcMovie.cn) 进行查阅.如需转载,请注明出处:http://www.cnblogs.com/Dod ...
- Dockerfile文件参数详解
参考: https://www.jianshu.com/p/e4b31ca37043 https://blog.csdn.net/u010246789/article/details/54139168 ...
- 自定义 Asp.Net SessionID 获取方式
新建类 CustomSessionIDManager public class CustomSessionIDManager : SessionIDManager, ISessionIDManager ...
- 学习迭代器实现C#异步编程——仿async/await(一)
.NET 4.5的async/await真是个神奇的东西,巧妙异常以致我不禁对其实现充满好奇,但一直难以窥探其门径.不意间读了此篇强文<Asynchronous Programming in C ...
- iOS Mac忘记登录密码的4种解决方法
4种方法: 一.使用Apple ID重置用户账户密码 使用这个方法有一个前提 如上图红框,此项必须勾选,否则无法使用Apple ID重置密码.(如果你不记得有没有勾选,则你起码要记得首次启动 OS X ...
- 使HTML页面上获取到的文本保留空格和换行符等格式
<pre> 元素可定义预格式化的文本.被包围在 pre 元素中的文本通常会保留空格和换行符.而文本也会呈现为等宽字体. <pre>的内容自动换行的问题(兼容多个浏览器): ...
- 微信小程序ofo小黄车+thinkphp5.0打造全栈应用
原文地址:https://www.imooc.com/article/20310 ofo至今还没有微信小程序(很费解),每次用ofo都得去支付宝,很不方便,我用微信用的比较多,无意间在简书上面看到某人 ...