我认为职责链最大的目的在于解决对一个对象的加工过程问题、并且如何通过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. 使用VisualSVN Server搭建SVN服务器(转载)

    转载于http://www.cnblogs.com/greywolf/archive/2013/01/28/2879952.html 使用 VisualSVN Server来实现主要的 SVN功能则要 ...

  2. Mybatis上路_06-使用Java自动生成

    目录[-] 1.编写Generator执行配置文件: 2.在MyEclipse中建空web项目: 3.编写并执行Java程序: 4.查看并修改生成的文件: 5.测试,使用生成的文件查询: 1)导入My ...

  3. linq to sql 博客集锦

    Linq to sql  比较全面的学习博客 http://www.cnblogs.com/aehyok/tag/Linq%20To%20Sql/ 使用LINQ TO SQL基于Respository ...

  4. Linux内核里的DebugFS

    DebugFS,顾名思义,是一种用于内核调试的虚拟文件系统,内核开发者通过debugfs和用户空间交换数据.类似的虚拟文件系统还有procfs和sysfs等,这几种虚拟文件系统都并不实际存储在硬盘上, ...

  5. 文件和目录之chdir、fchdir和getcwd函数

    每个进程都有一个当前工作目录,此目录是搜索所有相对路径名的起点(不以斜杠开始的路径名为相对路径名).当用户登录到UNIX系统时,其当前工作目录通常是口令文件(/etc/passwd)中该用户登录项的第 ...

  6. .Net设计模式_工厂模式(2)

    2.工厂方法模式 引言: 上一篇中我们描述了简单工厂的缺点,而解决方法就是把工厂接口化,把工厂的行为标准化,这就是工厂方法模式. 理解: 工厂能制造A和B鞋,如果消费者现在要求制造C鞋.D鞋...咋办 ...

  7. start mysqld on Mac server

    #!/bin/sh # Source the common setup functions for startup scripts test -r /etc/rc.common || exit 1 . ...

  8. (转)CSS行高——line-height

    原文地址:http://www.cnblogs.com/dolphinX/p/3236686.html 初入前端的时候觉得CSS知道display.position.float就可以在布局上游刃有余了 ...

  9. javascript-02

    1.js的特点2.js的数据类型3.js运算符 4.js的全局变量   |-定义在函数体外部的变量   |-定义在函数体内部没有使用var声明 var和没有var声明变量的区别?     |-var ...

  10. RabbitMQ 原文译06--Remote procedure call(RPC)

    在第三篇文章中, 我们学习了怎么使用队列在多了消息消费者当中进行耗时任务轮询. 但是如果我们想要在远程电脑上运行一个方法,然后等待其执行结果,这就是一个不同的场景,这种就是我们一般讲的RPC(远程过程 ...