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)是使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象 ...
随机推荐
- 【推荐】JAVA基础◆浅谈3DES加密解密
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- SCVMM问题汇总
1.在分配虚机到Hyper-V主机时,提示可用内存不足: 可能是虚机分配使用了动态内存,动态内存的最大值太大导致,将其改为固定内存大小即可.
- jquery如何让滚动条默认在最底部
$(document).ready(function() { $("#content").scrollTop($("#content")[0].offsetHe ...
- Installing the PHP/MongoDB extension on Mac OSX 10.8
Installing PHP/MongoDB extension is a two steps task on OSX: Install the autoconf tool required for ...
- 关于AFinal的混淆
http://blog.csdn.net/aibieqing241/article/details/38979531 我的前个项目中打算引用个框架,于是就看上了AFinal的这个开源库, 感觉用着还不 ...
- c#中cookies的存取操作
在客户端创建一个username的cookies,其值为gjy,有效期为1天. 方法1: Response.Cookies["username"].Value="zxf& ...
- Ubuntu jdk报Picked up JAVA_TOOL_OPTIONS信息解决
下面是摘自http://www.cnblogs.com/coderbean/p/4522182.html 以下是我在网上找了好久找到的: Ubuntu jdk报Picked up JAVA_TOOL_ ...
- 做一款仿映客的直播App?看我就够了
来源:JIAAIR 链接:http://www.jianshu.com/p/5b1341e97757 一.直播现状简介 1.技术实现层面: 技术相对都比较成熟,设备也都支持硬编码.IOS还提供现成 ...
- ASP.net导出EXCEL乱码?试试这个
网上的方法有说加meta的,是有用,不过,不够直接, 甭管你asp文件是utf-8还是gb2312,加入下面两句就搞掂: response.Charset="GB2312" ses ...
- 通过Html5的postMessage和onMessage方法实现跨域跨文档请求访问
在项目中有应用到不同的子项目,通过不同的二级域名实现相互调用功能.其中一个功能是将播放器作为单独的二级域名的请求接口,其他项目必须根据该二级域名调用播放器.最近需要实现视频播放完毕后的事件触发,调用父 ...