java设计模式-职责链模式


[toc]

职责链模式(Chain of Responsibility)

定义

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

使用场景

1、有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定; 2、在不明确指定接收者的情况下,向多个对象中的一个提交一个请求; 3、处理一个请求的对象集合应被动态指定。

类图

有一个Handler抽象类关联本身的一个对象,通过关联这个对象形成一个链进行传递请求。

实例

Handler抽象类:

/
 * 执行类
 *
 */
public abstract class Handler {
    /
     处理请求
     *
     /
    public abstract void handerRequest();
    public Handler nextHandler;
    public Handler getNextHandler() {
        return nextHandler;
    }
    public void setNextHandler(Handler nextHandler) {
        this.nextHandler = nextHandler;
    }
}

具体类:

public class ConcreteHandler extends  Handler{
    String name;
    public ConcreteHandler(String name){
        this.name = name;
    }
    /*
     * 处理请求
     /
    @Override
    public void handerRequest() {
        if(this.getNextHandler() != null){
            getNextHandler().handerRequest();
        }else{
            System.out.println(this.name + "处理了请求");
        }
    }
}

客户端:

public class Client {
    public static void main(String args[]){
        Handler h1 = new ConcreteHandler("handler1");
        Handler h2 = new ConcreteHandler("handler2");
        h1.setNextHandler(h2);
        h1.handerRequest();
    }
}

优缺点

不足之处:

1、对于每一个请求都需要遍历职责链,性能是个问题; 2、抽象处理者 AbstractHandler 类中的 handleRequest() 方法中使用了递归,栈空间的大小也是个问题。

特点

1、处理者在运行时动态确定其实是我们在 Client 中组装的链所引起的,因为具体的职责逻辑就在链中一一对应起来; 2、因为不确定请求的具体处理者是谁,所以我们把所有可能的处理者组装成一条链,在遍历的过程中就相当于向每个处理者都提交了这个请求,等待其审查。并且在审查过程中,即使不是最终处理者,也可以进行一些请求的“包装”操作(这种功能类似于装饰者模式),例如上面例子中的其他处理者; 3、处理者集合的动态指定跟上面的第1、2点类似,即在 Client 类中创建了所有可能的处理者。

nemotan /
Published under (CC) BY-NC-SA in categories 设计模式  tagged with 设计模式