【十一】Java设计模式GOF23之责任链模式

版权声明:转载注明出处 https://blog.csdn.net/jy02268879/article/details/86511117

简介

责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。

在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。

javax.servlet.Filter就是用的责任链模式

核心

1.Handler(抽象处理者): 定义一个处理请求的接口,保存对下一个结点(具体处理者)的引用

2.ConcreteHandler(具体处理者): 抽象处理者的子类,处理用户请求,可选将请求处理掉还是传给下一个结点。每个具体的处理者要构成一个链表或者顺序表。

最简单的责任链模式的UML类图

代码

 抽象处理者

package com.sid.chain;

/**
 * @program: DP
 * @description:
 * @author: Sid
 * @date: 2019-01-16 17:20
 * @since: 1.0
 **/
public abstract class AbstractHandler {
    private AbstractHandler handler;

    public abstract void handleRequest(String condition);

    public AbstractHandler getHandler() {
        return handler;
    }

    public void setHandler(AbstractHandler handler) {
        this.handler = handler;
    }
}

具体处理者A

package com.sid.chain;

/**
 * @program: DP
 * @description:
 * @author: Sid
 * @date: 2019-01-16 17:21
 * @since: 1.0
 **/
public class ConcreteHandlerA extends AbstractHandler {
    public void handleRequest(String condition) {
        if (condition.equals("A")) {
            System.out.println("ConcreteHandlerA处理");
        } else {
            System.out.println("ConcreteHandlerA不处理,由ConcreteHandlerA的下一个节点处理");
            super.getHandler().handleRequest(condition);
        }
    }
}

具体处理者B

package com.sid.chain;

/**
 * @program: DP
 * @description:
 * @author: Sid
 * @date: 2019-01-16 17:23
 * @since: 1.0
 **/
public class ConcreteHandlerB extends AbstractHandler{
    @Override
    public void handleRequest(String condition) {
        System.out.println("ConcreteHandlerB处理");
    }
}

构建具体处理链表,并且测试

package com.sid.chain;

/**
 * @program: DP
 * @description:
 * @author: Sid
 * @date: 2019-01-16 17:24
 * @since: 1.0
 **/
public class ChainClient {
    public static void main(String[] args) {
        AbstractHandler handlerA = new ConcreteHandlerA();
        AbstractHandler handlerB = new ConcreteHandlerB();
        handlerA.setHandler(handlerB);
        handlerA.handleRequest("B");
    }

}

运行结果

猜你喜欢

转载自blog.csdn.net/jy02268879/article/details/86511117
今日推荐