我认为职责链最大的目的在于解决对一个对象的加工过程问题、并且如何通过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 写职责链的更多相关文章

  1. JavaScript实现职责链模式

    什么是职责链模式 职责链模式的定义是:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止.举个例子:当你从公 ...

  2. JavaScript之职责链模式

    一.概述 职责链模式(Chain of responsibility),就是使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有 ...

  3. javascript设计模式——职责链模式

    前面的话 职责链模式的定义是使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止.职责链模式的名字非常形象,一 ...

  4. javascript设计模式实践之职责链--具有百叶窗切换图片效果的JQuery插件(三)

    在上一篇<javascript设计模式实践之模板方法--具有百叶窗切换图片效果的JQuery插件(二)>里,通过采用模板方法模式完成了切换效果对象的构建编写. 接下来就是完成各效果对象的调 ...

  5. JavaScript设计模式_10_职责链模式

    职责链模式的定义是:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止.职责链模式的名字非常形象,一系列可能 ...

  6. 用JavaScript写一个区块链

    几乎每个人都听说过像比特币和以太币这样的加密货币,但是只有极少数人懂得隐藏在它们背后的技术.在这篇博客中,我将会用JavaScript来创建一个简单的区块链来演示它们的内部究竟是如何工作的.我将会称之 ...

  7. 《javascript设计模式与开发实践》阅读笔记(13)—— 职责链模式

    职责链模式 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 书里的订单的例子 假设我们负责一个售卖手机 ...

  8. 怎么用JavaScript写一个区块链?

    几乎所有语言都可以编写区块链开发程序.那么如何用JavaScript写一个区块链?以下我将要用JavaScript来创建1个简单的区块链来演示它们的内部到底是怎样工作的.我将会称作SavjeeCoin ...

  9. 深入理解JavaScript系列(38):设计模式之职责链模式

    介绍 职责链模式(Chain of responsibility)是使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象 ...

随机推荐

  1. 怎么从代码中拿到栈回溯信息(call stack trace)

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:怎么从代码中拿到栈回溯信息(call stack trace).

  2. 自助用户选择VM Network

    在VMM中为用户所属角色分配“作者VM网络”权限后,用户才可以在部署虚机的选择不同的VM Network,否则用户只能使用模板上所使用的VM Network,无法进行选择

  3. IP地址的分类——a,b,c 类是怎样划分的

    如今的IP网络使用32位地址,以点分十进制表示,如172.16.0.0.地址格式为:IP地址=网络地址+主机地址 或 IP地址=主机地址+子网地址+主机地址. IP地址类型 最初设计互联网络时,为了便 ...

  4. 学习笔记:暴力破解WIFI小软件

    小弟 自己的学习笔记,做练习的 ,缺陷还很多,做到无法解决速度问题就不想做下去了,如果要看的话 主要是思路问题,获取句柄,控制句柄而已,代码比较简单.大神勿喷啊 破解DEMO源码:http://dow ...

  5. Could not find class &#39;****&#39;, referenced from method #####

    找不到类,多半也是和第三方的jar包有关. 将找不到的类.在下图中的地方勾选出来.假设jar太多.有的类有冲突的话,须要明白其先后顺序. 请外一篇和第三方jar有关的异常的文章. Conversion ...

  6. Windows 自己主动关机命令 shuntdown

    以下介绍一个在Windows XP下实现定时关机的简单方法. 一 .倒计时关机:      指定系统在10分钟后自己主动关闭:点击“開始→执行”,输入命令“Shutdown -s -t 60”(注意: ...

  7. Error: no `server' JVM at...解决办法 【转】

    出现问题:用java -jar XXX.jar -server -Xms900m -Xmx900m 提示错误Error: no `server' JVM at `C:\Program Files\Ja ...

  8. Android(java)学习笔记153:layout_weight使用注意事项

    1. android:layout_weight使用说明: layout_weight是权重的意思,也就是各个控件所占的比重,用在LinearLayout布局中.当我们使用layout_weight的 ...

  9. Android(java)学习笔记152:Android运行时异常“Binary XML file line # : Error inflating class”

    在原生Android下编译APK,编译没有问题,但是在运行的时候经常出现如标题所描述的异常:"Binary XML file line # : Error inflating class&q ...

  10. ASP.NET Mvc开发之EF延迟加载

    EF延迟加载:就是使用Lamabda表达式或者Linq 从 EF实体对象中查询数据时,EF并不是直接将数据查询出来,而是在用到具体数据的时候才会加载到内存. 一,实体对象的Where方法返回一个什么对 ...