责任链模式:责任链模式得角色分为发送者和接收者。发送者发送请求,接收者链中的第一个处理请求,当接受者不能处理请求时,将请求发送给下一个接收者。
责任链模式的特点: 1. 发送者只知道责任链中的第一个接收者。
2.每一个接受者都对请求进行分析,要么处理它,要么往下传递。
3.如果没有任何接受者处理请求,那么请求将从链上离开,不同的实现对此有不同的反应。
4.每一个接收者知道的其他对象只有一个,即它的下家对象。
现有一个任务 需要Python实现。项目组中有 小1,小2,小3,小4分别会Java,C++,Python,C#。项目经理要把它分给谁呢?项目经理嫌麻烦,不像一个一个的问,就直接给了小1。小1发现自己不会,就把他推给了小2,小2也发现自己不会就把他推给了小3,小3发现自己会Python,就把这个任务做了。()。
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
<script type="text/javascript" charset=utf-8 src="commons/CommonUtil.js"></script>
<script type=text/javascript charset=utf-8>
//**责任链模式
//发送者 ,及接受者,发送者只知道责任链中的第一个接收者。
//做项目 任务, 人员(及接受者)
//做项目 ->:项目经理 :->task 项目组[小A,小B,小C,小D]
var Assign = function(task){
this.task = task;
}
var WorkFlow = function(assign){
this.assign = assign;
}
WorkFlow.prototype = {
constructor:WorkFlow,
doHander:function(es){
for(var i = 0, length = es.length; i < length; i++){
if(es[i].cando == this.assign.task){
es[i].doWork();
break;
}
}
}
};
var Accept = function(name,cando){
this.name = name;
this.cando = cando;
this.doWork = function(){
document.write(this.name + " cando " + this.cando);
}
}
var agn = new Assign("javascript");
var es = [];
var accept1 = new Accept("xiao 1","java");
var accept2 = new Accept("xiao 2","javascript");
var accept3 = new Accept("xiao 3","c语言编程");
var accept4 = new Accept("xiao 4","c++编程");
// es.push(accept1);
// es.push(accept2);
// es.push(accept3);
// es.push(accept4);
var wk = new WorkFlow(agn);
//wk.doHander([accept1,accept2,accept3,accept4]);
var WorkFlow2 = function(assign){
this.assign = assign;
}
WorkFlow2.prototype = {
constructor:WorkFlow,
doHander:function(es){
if(es.cando == this.assign.task){
es.doWork();
}else{
arguments.callee.call(this,es.getSuccessor());
}
}
};
var Executer = function(name,cando){
this.name = name;
this.cando = cando;
this.successor = null;
}
Executer.prototype = {
constructor:Executer,
doWork:function(){
document.write(this.name + " cando " + this.cando);
},
setSuccessor:function(essor){
this.successor = essor;
},
getSuccessor:function(){
return this.successor;
}
}
var execute1 = new Executer("xiao 1","java");
var execute2 = new Executer("xiao 2","javascript");
var execute3 = new Executer("xiao 3","Python");
var execute4 = new Executer("xiao 4","c++编程");
execute1.setSuccessor(execute2);
execute2.setSuccessor(execute3);
execute3.setSuccessor(execute4);
var agn = new Assign("Python");
var work = new WorkFlow2(agn);
work.doHander(execute1);
</script>
</head>
<body>
</body>
</html>
输出 xiao 3 cando Python