我认为职责链最大的目的在于解决对一个对象的加工过程问题、并且如何通过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. C# Adomd Connection Analysis Service View Cube

    首先需要先引用 C:\Program Files\Microsoft.NET\ADOMD.NET\100\Microsoft.AnalysisServices.AdomdClient.dll      ...

  2. Redis常用数据类型

    Redis常用数据类型 转载自:http://blog.sina.com.cn/s/blog_7f37ddde0101021q.html     Redis最为常用的数据类型主要有以下五种: ●Str ...

  3. Java SE学习之printf 日期转换符

    本文是学习网络上的文章时的总结,感谢大家无私的分享. System.out.printf()方法能够对日期做处理输出. 相应列表 转换符 类型 举例 c 完整的日期和时间 Mon Feb 09 18: ...

  4. 在Apache Tomcat 7设置redis作为session store

    在Apache Tomcat 7设置redis作为session store  //输出tomcat控制台日志 root@ubuntu:~# cd /usr/tomcat/apache-tomcat- ...

  5. java 5 线程池

    import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Thr ...

  6. Java虚拟机学习 - 对象访问

    对象访问会涉及到Java栈.Java堆.方法区这三个内存区域. 如下面这句代码: Object objectRef = new Object(); 假设这句代码出现在方法体中,"Object ...

  7. javaweb之Filter详解(转)

    .概念: Filter也称之为过滤器,它是Servlet技术中比较激动人心的技术,WEB开发人员通过Filter技术,对web服务器管理的所有web资源: 例如Jsp, Servlet, 静态图片文件 ...

  8. careercup-数学与概率 7.6

    7.6 在二维平面上,有一些点,请找出经过点数最多的那条线. 解法: 类似于leetcode:Max Points on a Line 我们只需在任意两点之间“画”一条无限长的直线(也即不是线段),并 ...

  9. 虚拟机windows xp 下安装配置mysql cluster 7.3.2

    1.虚拟机环境下安装的 1 192.168.131.21(管理节点,存储节点,sql节点) 2 192.168.131.22(存储节点,sql节点)   2.安装程序 在两台机器上面同时进行 第一步: ...

  10. List IEnumerable

    //按部门汇总            IEnumerable<WeekReportWithDepartmentInfo> report = summary            .Grou ...