java设计模式之责任链模式详解架构师
一.定义
责任链模式是用一系列类(classes)试图处理一个请求request,这些类之间是一个松散的耦合,唯一共同点是在他们之间传递request。也就是说,来了一个请求,A类先处理,如果没有处理,就传递到B类处理,如果没有处理,就传递到C类处理,就这样象一个链条(chain)一样传递下去。
二.如何使用责任链模式
虽然这一段是如何使用CoR,但是也是演示什么是CoR。
三.程序代码示例
1.有一个Handler接口:
public interface Handler{
public void handleRequest();
}
这是一个处理request的事例, 如果有多种request,比如 请求帮助 请求打印 或请求格式化:
2.最先想到的方案是:在接口中增加多个请求:
public interface Handler{
public void handleHelp();
public void handlePrint();
public void handleFormat();
}
3.具体是一段实现接口Handler代码:
public class ConcreteHandler implements Handler{
private Handler successor;
public ConcreteHandler(Handler successor){
this.successor=successor;
}
public void handleHelp(){
//具体处理请求Help的代码
}
public void handlePrint(){
//如果是print 转去处理Print
successor.handlePrint();
}
public void handleFormat(){
//如果是Format 转去处理format
successor.handleFormat();
}
}
一共有三个这样的具体实现类,上面是处理help,还有处理Print 处理Format这大概是我们最常用的编程思路。
虽然思路简单明了,但是有一个扩展问题,如果我们需要再增加一个请求request种类,需要修改接口及其每一个实现。
4.将每种request都变成一个接口,因此我们有以下代码 :
public interface HelpHandler{
public void handleHelp();
}
public interface PrintHandler{
public void handlePrint();
}
public interface FormatHandler{
public void handleFormat();
}
public class ConcreteHandler
implements HelpHandler,PrintHandler,FormatHandlet{
private HelpHandler helpSuccessor;
private PrintHandler printSuccessor;
private FormatHandler formatSuccessor;
public ConcreteHandler(HelpHandler helpSuccessor,PrintHandler printSuccessor,FormatHandler formatSuccessor)
{
this.helpSuccessor=helpSuccessor;
this.printSuccessor=printSuccessor;
this.formatSuccessor=formatSuccessor;
}
public void handleHelp(){
}
public void handlePrint(){this.printSuccessor=printSuccessor;}
public void handleFormat(){this.formatSuccessor=formatSuccessor;}
}
这个办法在增加新的请求request情况下,只是节省了接口的修改量,接口实现ConcreteHandler还需要修改。而且代码显然不简单美丽。
5.在Handler接口中只使用一个参数化方法:
public interface Handler{
public void handleRequest(String request);
}
那么Handler实现代码如下:
public class ConcreteHandler implements Handler{
private Handler successor;
public ConcreteHandler(Handler successor){
this.successor=successor;
}
public void handleRequest(String request){
if (request.equals( Help )){
//这里是处理Help的具体代码
}else
//传递到下一个
successor.handle(request);
}
}
}
这里先假设request是String类型,如果不是怎么办?当然我们可以创建一个专门类Request
6.接口Handler的代码如下:
public interface Handler{
public void handleRequest(Request request);
}
Request类的定义:
public class Request{
private String type;
public Request(String type){this.type=type;}
public String getType(){return type;}
public void execute(){
//request真正具体行为代码
}
}
7.那么Handler实现代码如下:
public class ConcreteHandler implements Handler{
private Handler successor;
public ConcreteHandler(Handler successor){
this.successor=successor;
}
public void handleRequest(Request request){
if (request instanceof HelpRequest){
//这里是处理Help的具体代码
}else if (request instanceof PrintRequst){
request.execute();
}else
//传递到下一个
successor.handle(request);
}
}
}
这种解决方案就是CoR,在一个链上,都有相应职责的类,因此叫Chain of Responsibility。
CoR的优点:因为无法预知来自外界的请求是属于哪种类型,每个类如果碰到它不能处理的请求只要放弃就可以。无疑这降低了类之间的耦合性。
CoR的缺点是效率低,因为一个请求的完成可能要遍历到最后才可能完成,当然也可以用树的概念优化。 在Java AWT1.0中,对于鼠标按键事情的处理就是使用CoR,到Java.1.1以后,就使用Observer代替CoR。
扩展性差,因为在CoR中,一定要有一个统一的接口Handler.局限性就在这里。
转载请注明来源网站:blog.ytso.com谢谢!
7000.html
架构架构师架构设计相关文章
- java线程池的面试题_献给准备面试的你,Java线程and线程池面试题小结「建议收藏」
- java map 二维数组_Java二维数组实现简单Map
- 学java用什么编译器_学习Java用什么编译软件好
- java中scanner意思_Java中的Scanner
- java单例模式_Java单例模式
- java怎么运行_怎样启动JAVA?「建议收藏」
- 说一下java的运行机制_Java运行机制是什么?「建议收藏」
- java messagedigest_Java 自带的加密类MessageDigest类(加密MD5和SHA)[通俗易懂]
- java工厂模式实例(设计模式)「建议收藏」
- java后台怎么解密md5,Java md5 密码加解密
- java 流水线模式_流水线设计模式实现
- Java cloneable_java浅克隆和深克隆
- Java设计模式之外观模式
- Java设计模式之适配器模式
- Java设计模式之状态模式
- Java设计模式之观察者模式
- Java设计模式之迭代器模式
- 面向对象设计模式--原型模式详解+实际应用(Java)
- java设计模式之状态模式详解架构师
- java设计模式之备忘录模式详解架构师
- java设计模式之模板模式详解架构师
- java设计模式之观察者模式详解架构师
- Java学习笔记之九java二维数组及其多维数组的内存应用拓展延伸详解编程语言
- Java联合Redis:建立良好数据连接(java连接redis)
- Java 调用 MySQL,编写数据库程序(java导入mysql)
- Java导出Oracle数据提升数据分析流程效率(java导出oracle)
- 编程玩转Java之Oracle编程实战(java中的oracle)
- java设计模式之建造者模式学习