设计模式之职责链模式(责任链模式)

职责链模式

顾名思义,职责链模式=责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。

  • **意图:**避免请求发送者与接收者耦合在一起,让多个对象都有可能接收请求,将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。

    **主要解决:**职责链上的处理者负责处理请求,客户只需要将请求发送到职责链上即可,无须关心请求的处理细节和请求的传递,所以职责链将请求的发送者和请求的处理者解耦了。

实现

结构

职责链模式主要包含以下角色。

  • 抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。

  • 具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。

  • 客户类(Client)角色:创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。

责任链模式的本质是解耦请求与处理,让请求在处理链中能进行传递与被处理;理解责任链模式应当理解其模式,而不是其具体实现。责任链模式的独到之处是将其节点处理者组合成了链式结构,并允许节点自身决定是否进行请求处理或转发,相当于让请求流动起来。

结构图

责任链模式的结构图

代码实现

/**
 * @author:pier 2021/11/15
 **/
public class ChainOfResponsibilityPattern {
    
    
    public static void main(String[] args) {
    
    
        //组装责任链
        Handler handler1 = new ConcreteHandler1();
        Handler handler2 = new ConcreteHandler2();
        handler1.setNext(handler2);
        //提交请求
        handler2.handleRequest("one");
        handler1.handleRequest("two");
    }
}

//抽象处理者角色
abstract class Handler {
    
    
    private Handler next;

    public void setNext(Handler next) {
    
    
        this.next = next;
    }

    public Handler getNext() {
    
    
        return next;
    }

    //处理请求的方法
    public abstract void handleRequest(String request);
}

//具体处理者角色1
class ConcreteHandler1 extends Handler {
    
    
    @Override
    public void handleRequest(String request) {
    
    
        if ( request.equals("one") ) {
    
    
            System.out.println("具体处理者1负责处理该请求!");
        } else {
    
    
            if ( getNext() != null ) {
    
    
                getNext().handleRequest(request);
            } else {
    
    
                System.out.println("没有人处理该请求!");
            }
        }
    }
}

//具体处理者角色2
class ConcreteHandler2 extends Handler {
    
    
    @Override
    public void handleRequest(String request) {
    
    
        if ( request.equals("two") ) {
    
    
            System.out.println("具体处理者2负责处理该请求!");
        } else {
    
    
            if ( getNext() != null ) {
    
    
                getNext().handleRequest(request);
            } else {
    
    
                System.out.println("没有人处理该请求!");
            }
        }
    }
}

结果运行

没有人处理该请求!
具体处理者2负责处理该请求!

进程已结束,退出代码为 0

小结一下

/*
程序运行结果如下:
具体处理者2负责处理该请求!
*/

/*
在上面代码中,我们把消息硬编码为 String 类型,而在真实业务中,消息是具备多样性的,
可以是 int、String 或者自定义类型。因此,在上面代码的基础上,可以对消息类型进行抽象 Request,增强了消息的兼容性。
*/

猜你喜欢

转载自blog.csdn.net/qq_43325476/article/details/121329800