设计模式之责任链模式

编程

定义

Avoid coupling the sender of a request to its receiver by giving more than one object a chance to handle the request.Chain the receiving objects and pass the request along the chain until an object handles it.(使多个对象都有机会处理请求,从而避免了请求的发送者和接受者之间的耦合关 系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象处理它为止。)

UML类图

角色:

  • Hanlder 抽象处理者
  • ConcreateHander 处理者实现

应用场景

针对一类请求,有多个处理方法,如果不用责任链模式代码会类似为:

if(type = 1){

//这么处理

}else if(type = 2){

//这么处理

}else if(type =3){

//这么处理

}else{

//这么处理

}

针对这种if-elseif-else结构的分支,可以将处理方式进行抽象封装为Hanlder。用链的形式传递请求到各个实现类。

比如针对一个请求Request,抽象的Hanlder处理逻辑为:

public final void hanlderMessage(Request request){

//如果自己能够处理

if(request.getType().equals(this.getType)){

//自己进行处理

this.response()

}else{

if(this.getNextHanlder() == null){

//如果没有接替者,按默认情况处理

this.hanlderMessageDefault(request);

}else{

//交给自己的接替者进行处理

this.getNextHanlder().hanlderMessage(request);

}

}

}

大概就是这种结构,其中运用了模板方法模式,hanlderMessage就是每个ConcreateHanlder类继承的方法。继承类只需要实现resonse方法来按照自己的逻辑实现处理,这个抽象Hanlder只需要提供对外的方法setType用来定义自己的处理级别与请求的类型相对应,以及hanlderMessage来处理请求。

优点

优点是封装了if-elseif-else这种的逻辑分支,将请求与处理分了开来,请求只需要关心抽象的Hanlder。而具体实现ConcreateHanlder也不用关心具体的请求全貌,只需要处理自己的方式。如果需要扩展处理只需要多实现一个Hanlder就可以了。

缺点

缺点也很明显,这种链表的调用形式,如果调用链过长会浪费栈内存空间。

以上是 设计模式之责任链模式 的全部内容, 来源链接: utcz.com/z/510851.html

回到顶部