Java大数据之路--责任链模式

责任链模式


概述

 责任链模式,在面向对象里是一种软件设计模式,它包含了一些命令对象和一系列的处理对象。使多个对象都有处理请求的机会,从而避免请求的发送者和接收者之间的耦合关系,这个请求沿着一条链下去直至处理完为止。

角色

抽象处理者角色:定义出一个处理请求的接口,如果需要,接口中可以定义出一个方法以设定和返回下家的引用,这个角色通常是一个java抽象类或者是java的接口来实现的。

具体处理者角色:具体处理者接到请求后,可以选择将请求处理掉,或者请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要具体处理者可以访问下家。

优点

解耦了请求和处理,请求处理者只需要关注自己的需要的请求进行处理就好,对于不需要的请求,直接转发给下一级处理者。

具备链式传递处理请求功能,请求发送者不需要知道链路中的接口,只需要等待处理结果,链路结构灵活,可以通过改变链路结构动态的新增或删除任务。

易于增加新的处理者。

缺点

当责任链的链过长的时候,会降低请求处理的效率,处理者对象存在循环引用,可能会造成死循环,内存溢出。

不利于调试,逻辑比较复杂。

应用场景

多个对象处理同一个请求,但需要动态决定哪一个对象处理的时候。

代码示例

/**
 * 测试
 */
public class ChainofResponsibilityDemo {
    public static void main(String[] args) {
        Handler handlerA = new HandlerA();
        Handler handlerB = new HandlerB();
        handlerA.setNext(handlerB);
        handlerA.getReq("AB");
    }
}
/**
 * 处理器抽象类
 */
abstract class Handler{
     Handler next;
    public void setNext(Handler next) {
        this.next = next;
    }
    public abstract void getReq(String req);
}

/**
 * 处理者A
 */
class HandlerA extends Handler{
    @Override
    public void getReq(String req) {
        if (req.contains("A")) {
            System.out.println(this.getClass().getSimpleName()+":处理器A处理了该请求");
        }
        if (this.next!=null){
            this.next.getReq(req);
        }
    }
}
/**
 * 处理者B
 */
class HandlerB extends Handler{
    @Override
    public void getReq(String req) {
        if (req.contains("B")) {
            System.out.println(this.getClass().getSimpleName()+":处理器B处理了该请求");
        }
        if (this.next!=null){
            this.next.getReq(req);
        }
    }
}
console:
HandlerA:处理器A处理了该请求
HandlerB:处理器B处理了该请求

 

你可能感兴趣的:(设计模式)