JAVA设计模式之责任链模式

214 阅读2分钟

本文介绍23种设计模式之责任链模式。

定义

责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。当你想要让一个以上的对象有机会处理某个请求时,就可以使用责任链模式。

描述

  • 模式名称:CHAIN OF RESPONSIBILITY(责任链)
  • 类型:对象行为型模式
  • 意图:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
  • 适用性:
    • 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。
    • 你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。
    • 可处理一个请求的对象集合应被动态指定。
  • 效果:
  • 优点:
    • 降低耦合度。
    • 增强了给对象指派职责的灵活性。
  • 缺点:
    • 不能保证请求一定被接收。

类图

1629628507(1).jpg

  1. 抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。
  2. 具体处理者(ConcreteHandler)角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。

实现代码

Handler

public abstract class Handler {

    protected Handler successor;

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

    abstract void handleRequest();
}

ConcreteHandler

public class SpamHandler extends Handler {
   @Override
   void handleRequest() {
       //判断是否可以处理,处理不了就交给后继者
       System.out.println("SpamHandler 处理不了,交由继承者处理");
       successor.handleRequest();
   }
}
public class FanHandler extends Handler {
    @Override
    void handleRequest() {
        //判断是否可以处理,处理不了就交给后继者
        System.out.println("FanHandler 处理不了,交由继承者处理");
        successor.handleRequest();
    }
}
public class ComplaintHandler extends Handler {
    @Override
    void handleRequest() {
        //判断是否可以处理,处理不了就交给后继者
        System.out.println("ComplaintHandler 处理不了,交由继承者处理");
        successor.handleRequest();
    }
}
public class NewLocHandler extends Handler {
    @Override
    void handleRequest() {
        //判断是否可以处理,处理不了就交给后继者
        System.out.println("NewLocHandler 处理完成");

    }
}

client

public class Client {
    public static void main(String[] args) {
        SpamHandler spamHandler = new SpamHandler();
        FanHandler fanHandler = new FanHandler();
        ComplaintHandler complaintHandler = new ComplaintHandler();
        NewLocHandler newLocHandler = new NewLocHandler();
        spamHandler.setSuccessor(fanHandler);
        fanHandler.setSuccessor(complaintHandler);
        complaintHandler.setSuccessor(newLocHandler);
        spamHandler.handleRequest();
    }
}

执行结果:
SpamHandler 处理不了,交由继承者处理
FanHandler 处理不了,交由继承者处理
ComplaintHandler 处理不了,交由继承者处理
NewLocHandler 处理完成

整体的调用流程为

image.png