设计模式-职责链模式
来源:互联网 发布:黑暗骑士崛起 知乎 编辑:程序博客网 时间:2024/05/02 01:29
对于职责链模式,一般是这么定义的:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,即——将这些对象连成一条(处理)链,并沿着这条链传递该请求,直到这条链结束同时有一个对象处理它为止。
最经典的职责链模式应用就是JavaEE规范中web.xml的filter了,filters按照配置的顺序,依次处理根据其mapping条件过滤得到的web请求(response)/应答(request),从而可以实现诸如编码转换、事务封装、页面缓存等众多“职责”。
给出职责链模式的适用范围:
1、有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
2、想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
3、可处理一个请求的对象集合需要被动态指定。
下面这个范例模拟了一个软件行业中常见的项目处理流程,为一个项目(Project对象)的职责人员构造了一条处理链,然后向这个项目发出处理指令——从而在这条链上引发相关职责人员的处理。代码如下:
职责的接口定义,所有的职责人员都要具有这些功能:加入下一职责对象、处理消息(即行使职责)、获得下一职责对象。
package com.alex.designpattern.chainofresponsibility;
public interface Chain ...{
public void addChain(Chain c);
public void sendToChain(String mesg);
public Chain getChain();
}
以下就是我们流程中所有的职责人员实现啦,依次为经理、项目经理、程序员、测试员及其它,它们根据mesg参数分别处理自己的消息——即行使特定的职责。
package com.alex.designpattern.chainofresponsibility;
public class Manager implements Chain ...{
private Chain nextChain = null;
private static final String Responsibility = "Getting Project";
public void addChain(Chain c) ...{
nextChain = c;
}
public Chain getChain() ...{
return nextChain;
}
public void sendToChain(String mesg) ...{
if (mesg.equals(Responsibility)) ...{
System.out.println("A Manager --> " + mesg);
} else ...{
if (nextChain != null) ...{
nextChain.sendToChain(mesg);
}
}
}
}
package com.alex.designpattern.chainofresponsibility;
public class ProjectManager implements Chain ...{
private Chain nextChain = null;
private static final String Responsibility = "Design";
public void addChain(Chain c) ...{
nextChain = c;
}
public Chain getChain() ...{
return nextChain;
}
public void sendToChain(String mesg) ...{
if (mesg.equals(Responsibility)) ...{
System.out.println("A Project Manager --> " + mesg);
} else ...{
if (nextChain != null) ...{
nextChain.sendToChain(mesg);
}
}
}
}
package com.alex.designpattern.chainofresponsibility;
public class Programmer implements Chain ...{
private Chain nextChain = null;
private static final String Responsibility = "Coding";
public void addChain(Chain c) ...{
nextChain = c;
}
public Chain getChain() ...{
return nextChain;
}
public void sendToChain(String mesg) ...{
if (mesg.equals(Responsibility)) ...{
System.out.println("A Programmer --> " + mesg);
} else ...{
if (nextChain != null) ...{
nextChain.sendToChain(mesg);
}
}
}
}
package com.alex.designpattern.chainofresponsibility;
public class QA implements Chain ...{
private Chain nextChain = null;
private static final String Responsibility = "Testing";
public void addChain(Chain c) ...{
nextChain = c;
}
public Chain getChain() ...{
return nextChain;
}
public void sendToChain(String mesg) ...{
if (mesg.equals(Responsibility)) ...{
System.out.println("A QA --> " + mesg);
} else ...{
if (nextChain != null) ...{
nextChain.sendToChain(mesg);
}
}
}
}
package com.alex.designpattern.chainofresponsibility;
public class Others implements Chain ...{
private Chain nextChain = null;
public void addChain(Chain c) ...{
nextChain = c;
}
public Chain getChain() ...{
return nextChain;
}
public void sendToChain(String mesg) ...{
System.out.println("None can handle --> " + mesg);
}
}
下面当然是测试的主程序了,首先我们按照顺序初始化这条“链”——项目来了,先是部门经理过目,然后交给相关项目经理做设计,有了设计程序员就可以编码了,完工后测试人员测试,最后来到职责链末尾结束(当然,真实的情况下,不会有这么顺利的项目:-)。注意我们在这里定义了一个Project类,将由它的对象引发这条“链”的连锁反应。
package com.alex.designpattern.chainofresponsibility;
public class Test ...{
public static void main(String[] args) ...{
Project project = new Project();
Manager aManager = new Manager();
ProjectManager aPM = new ProjectManager();
Programmer aProgrammer = new Programmer();
QA aQA = new QA();
Others others = new Others();
// init chain
aManager.addChain(aPM);
aPM.addChain(aProgrammer);
aProgrammer.addChain(aQA);
aQA.addChain(others);
project.setChain(aManager);
project.getChain().sendToChain("Getting Project");
project.getChain().sendToChain("Design");
project.getChain().sendToChain("Coding");
project.getChain().sendToChain("Testing");
project.getChain().sendToChain("Over");
}
}
class Project ...{
private Chain chain;
public Chain getChain() ...{
return chain;
}
public void setChain(Chain chain) ...{
this.chain = chain;
}
}
结合这个例子,那就很容易理解web.xml中常用的filter了吧,每个filter都是职责链中的一环,它们按照自己的职责过滤web的请求、应答……这就是职责链模式。
- 职责链设计模式
- 【设计模式】职责链
- 设计模式---职责链
- 职责链设计模式
- 职责链设计模式
- 设计模式---职责链模式
- 设计模式-职责链模式
- 设计模式 职责链模式
- 设计模式- 职责链模式
- 设计模式 - 职责链模式
- 设计模式 - 职责链模式
- 设计模式-职责链模式
- 设计模式--职责链模式
- 设计模式-职责链模式
- 设计模式--职责链模式
- 设计模式-职责链模式
- 【设计模式】职责链模式
- 设计模式-职责链模式
- QMenu上icon的大小设置
- 简单操作权限就一个函数足够了,甚至5-6个表足够可以了,没必要搞那么复杂,也没必要瞎搞误人子弟啊
- APP开发小贴士---问题虽小,但是需要注重
- Java 解析XML 之 DOM4J 解析 XML 分析测试
- C#编程指令的好处和用法
- 设计模式-职责链模式
- Google Chrome下Flash Player Debug失效
- Sql Server 常用日期格式转换
- PHP5版本的讲解
- 移动互联网袭来 如何成为一个android开发者
- 移动互联网袭来 如何成为一个android开发者
- 考试常考的SQL题目
- C# 动态编译代码实现
- 深入理解Magento - 第一章