atwood-pan

 

14-设计模式——责任链模式

设计模式——责任链模式

责任链模式 => Chain Of Responsibility

模式定义:

为请求创建了一个接收者对象的链

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。

将这些对象连成一条链,并沿着这条链发送该请求,直到有一个对象处理它为止。

LQgvPU.png


Class Diagram

  • Handler:定义处理请求的接口,并且实现后继链(successor)

LQ22QJ.png

package com.example.designpatterns.chainofresponsibility;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @program: DesignPatterns
 * @description: 责任链模式
 * @author: Coder_Pan
 * @create: 2022-04-14 09:47
 **/
public class ChainOfResponsibilityTest {

    public static void main(String[] args) {
        System.out.println("Chain Of Responsibility......责任链模式......");
        ConcreteHandler1 handler1 = new ConcreteHandler1(null);
        ConcreteHandler2 handler2 = new ConcreteHandler2(handler1);

        Request request1 = new Request(RequestType.TYPE1, "request1");
        handler2.handlerRequest(request1);

        Request request2 = new Request(RequestType.TYPE2, "request2");
        handler2.handlerRequest(request2);
    }
}
/**
 * 定义一个抽象 的请求接口
 *
 */
@Data
abstract class Handler {
    protected Handler successor;

    public Handler(Handler successor) {
        this.successor = successor;
    }

    /**
     * 用于处理请求
     * @param request
     */
    protected abstract void handlerRequest(Request request);
}
/**
 * 定义一个请求对象
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
class Request {
    private RequestType type;
    private String name;
}

/**
 * 请求枚举类
 */
enum RequestType {
    TYPE1, TYPE2
}

/**
 * 实现不同的请求
 */
class ConcreteHandler1 extends Handler {

    public ConcreteHandler1(Handler successor) {
        super(successor);
    }
    @Override
    protected void handlerRequest(Request request) {
        if (request.getType() == RequestType.TYPE1) {
            System.out.println(request.getName() + " is handle by ConcreteHandler1");
            return;
        }
        if (successor != null) {
            successor.handlerRequest(request);
        }
    }
}
class ConcreteHandler2 extends Handler {

    public ConcreteHandler2(Handler successor) {
        super(successor);
    }


    @Override
    protected void handlerRequest(Request request) {
        if (request.getType() == RequestType.TYPE2) {
            System.out.println(request.getName() + " is handle by ConcreteHandler2");
            return;
        }
        if (successor != null) {
            successor.handlerRequest(request);
        }
    }
}

posted on 2022-04-14 10:04  JavaCoderPan  阅读(12)  评论(0编辑  收藏  举报  来源

导航