javascript 写职责链
我认为职责链最大的目的在于解决对一个对象的加工过程问题、并且如何通过filter在什么时机截止操作流程
/**
* by JackChen 2016-3-14 15.16.53
* 职责链
* 看马士兵老师的java 设计模式,后自己尝试写的。
*
* 演示,实现了两部分内容:
* 一个,是职责链元素的添加,和执行(按顺序)
* 一个,是职责链过程的打断,
*
* 通过切面(也可以说javascript的装饰模式)修改我们的serverMethod
* 从而加入filter改变调用结果
*/ //////////////////////////////////////////////////////////////////////
/// 集合filter
var FilterChain = function() {
var self = this; self.chain = new Array();
self.name = "Chain";
self.index = 0;
self.error = false;
};
FilterChain.prototype = {};
FilterChain.prototype.constructor = FilterChain; //循环调用自己的子元素
FilterChain.prototype.doFilterForward = function(input) {
var self = this;
console.log("f " + self.name);
if (!self.error) {
for (var i = 0; i < self.chain.length; i++) {
if (!self.chain[i].doFilterForward(input)) {
self.error = true;
return false;
};
};
return true;
};
return false;
}; //循环调用自己的子元素
FilterChain.prototype.doFilterBackward = function(output) {
var self = this;
console.log("b " + self.name);
if (!self.error) {
for (var i = self.chain.length - 1; i >= 0; i--) {
if (!self.chain[i].doFilterBackward(output)) {
self.error = true;
return false;
};
};
return true;
}
return false;
}; //添加子元素
FilterChain.prototype.addFilter = function(filter) {
console.log(filter.name);
this.chain.push(filter);
}; ///////////////////////////////////////////////////////////////////////
/// 普通叶子元素
var FilterLeaf = function() {
var self = this; self.name = "Leaf";
};
FilterLeaf.prototype = {};
FilterLeaf.prototype.constructor = FilterLeaf; //在数据加上自己
FilterLeaf.prototype.doFilterForward = function(input) {
var self = this;
console.log("f " + self.name);
input.data += "<" + self.name + ">";
return true;
}; //在数据加上自己
FilterLeaf.prototype.doFilterBackward = function(output) {
var self = this;
console.log("b " + self.name);
output.data += "</" + self.name + ">";
return true;
}; /////////////////////////////////////////////////////////////////////
/// 长度处理filter
var FilterLength = function() {
var self = this;
self.max_length = 1000;
self.name = "Length";
};
FilterLength.prototype = {};
FilterLength.prototype.constructor = FilterLength; //判断数据超长则终止
FilterLength.prototype.doFilterForward = function(input) {
var self = this;
console.log("f " + self.name);
if (input.data.length <= self.max_length) {
input.data += "<!--" + self.name + "-->";
return true;
}
else {
return false;
};
}; FilterLength.prototype.doFilterBackward = function(output) {
var self = this;
console.log("b " + self.name);
output.data += "<!--" + self.name + "-->";
return true;
}; //////////////////////////////////////////////////////////////
/// 测试数据
/// //输入数据
var origin = {
data: "aaaaaaaa1aaaa",
};
//输出数据
var result = {
data: "",
}; //原生处理函数
var serverMethod = function(input, output) {
output.data = "Server recv :[ " + input.data + " ]";
} //创建我们的filter数据
var masterChain = new FilterChain(); //截断用filter
var lengthFilter = new FilterLength();
lengthFilter.max_length = 1000;//检测长度
masterChain.addFilter(lengthFilter); //普通元素
var omiga = new FilterLeaf();
omiga.name = "omiga";
masterChain.addFilter(omiga); //集合元素
var alpha0 = new FilterLeaf();
alpha0.name = "alpha0";
var beta0 = new FilterLeaf();
beta0.name = "beta0";
var fatherChain0 = new FilterChain();
fatherChain0.name = "fatherChain0";
fatherChain0.addFilter(alpha0);
fatherChain0.addFilter(beta0);
masterChain.addFilter(fatherChain0); //集合元素
var alpha1 = new FilterLeaf();
alpha1.name = "alpha1";
var beta1 = new FilterLeaf();
beta1.name = "beta1";
var fatherChain1 = new FilterChain();
fatherChain1.name = "fatherChain1";
fatherChain1.addFilter(alpha1);
fatherChain1.addFilter(beta1);
masterChain.addFilter(fatherChain1); //普通元素
var gama = new FilterLeaf();
gama.name = "gama";
masterChain.addFilter(gama); //重写处理函数
var old_serrserverMethod = serverMethod;
serverMethod = function(input, output) {
if (!masterChain.doFilterForward(input)) {
return;
};
old_serrserverMethod(input, output);
if (masterChain.doFilterBackward(output)) {
return;
};
} //实际调用
serverMethod(origin, result); //测试输出
console.log("origin :" + origin.data);
console.log("result :" + result.data);
javascript 写职责链的更多相关文章
- JavaScript实现职责链模式
什么是职责链模式 职责链模式的定义是:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止.举个例子:当你从公 ...
- JavaScript之职责链模式
一.概述 职责链模式(Chain of responsibility),就是使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有 ...
- javascript设计模式——职责链模式
前面的话 职责链模式的定义是使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止.职责链模式的名字非常形象,一 ...
- javascript设计模式实践之职责链--具有百叶窗切换图片效果的JQuery插件(三)
在上一篇<javascript设计模式实践之模板方法--具有百叶窗切换图片效果的JQuery插件(二)>里,通过采用模板方法模式完成了切换效果对象的构建编写. 接下来就是完成各效果对象的调 ...
- JavaScript设计模式_10_职责链模式
职责链模式的定义是:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止.职责链模式的名字非常形象,一系列可能 ...
- 用JavaScript写一个区块链
几乎每个人都听说过像比特币和以太币这样的加密货币,但是只有极少数人懂得隐藏在它们背后的技术.在这篇博客中,我将会用JavaScript来创建一个简单的区块链来演示它们的内部究竟是如何工作的.我将会称之 ...
- 《javascript设计模式与开发实践》阅读笔记(13)—— 职责链模式
职责链模式 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 书里的订单的例子 假设我们负责一个售卖手机 ...
- 怎么用JavaScript写一个区块链?
几乎所有语言都可以编写区块链开发程序.那么如何用JavaScript写一个区块链?以下我将要用JavaScript来创建1个简单的区块链来演示它们的内部到底是怎样工作的.我将会称作SavjeeCoin ...
- 深入理解JavaScript系列(38):设计模式之职责链模式
介绍 职责链模式(Chain of responsibility)是使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象 ...
随机推荐
- AptanaStudio3 安装在win7 64bit时遇到的问题
最近在研究前端语言,想起可以使用AptanaStudio这个前端利器,没想到安装时却遇到波折.先从网上下载了Aptana版本 3.6.0 64bit问题1 安装进度缓慢,第一次安装时,显示downlo ...
- JavaScript【5】高级特性(作用域、闭包、对象)
笔记来自<Node.js开发指南>BYVoid编著 1.作用域 if (true) { var somevar = 'value'; } console.log(somevar); Jav ...
- Static NAT with iptables on Linux
本文的名字取的比较有意义,因为本文并不是真的要讨论如何在Linux上使用iptables实现static nat!之所以这么命名本文,是想引起别人的注意,因为中文资料,以及国内的搜索引擎,基本上没有人 ...
- Java开源内容管理CMS系统J4CMS支持静态化直接ftp上传到你的空间了
页面可直接编辑的cms系统j4cms能够直接支持使用ftp 输出 html到你的空间了 真正的静态化 这是静态化后的站点 http://www.j4cms.com/ 源代码上传至csdn了,能够下载源 ...
- mysql优化之索引优化
Posted by Money Talks on 2012/02/23 | 第一篇 序章第二篇 连接优化第三篇 索引优化第四篇 查询优化第五篇 到实战中去 索引优化 索引优化涉及到几个方面,包括了索引 ...
- 通过NSURLProtocol拦截HTTP转HTTPS来整合SPDY的记录
众所周知,iOS 9.0之后苹果引入ATS限制,苹果也推荐尽量不要使用HTTP通讯了,毕竟是很不安全的.而国内各个有(wu)节操的运营商也会经常篡改请求HTTP请求.所以如果可能,在不影响性能的情况下 ...
- Nexus搭建Maven服务器
参考:http://blog.csdn.net/ichsonx/article/details/14642897 1. 为什么使用Nexus 如果没有私服,我们所需的所有构件都需要通过maven的中央 ...
- 转:Oracle EBS FND User Info API
转自:http://www.cnblogs.com/quanweiru/p/3775635.html 1. 与用户信息相关API PKG. --和用户处理有关的API FND_USER_PKG; -- ...
- SQL 收缩数据库文件大小
USE WebExam; GO ALTER DATABASE WebExam SET RECOVERY SIMPLE; GO -- 收缩文件到 1 MB. ); GO ALTER DATABASE W ...
- photoshop 常用快捷键大全
一.文件新建 CTRL+N打开 CTRL+O 打开为 ALT+CTRL+O关闭 CTRL+W保存 CTRL+S 另存为 CTRL+SHIFT+S另存为网页格式 CTRL+ALT+S打印设置 CTRL+ ...