责任链模式

本文介绍了责任链模式,一种设计模式,用于让多个对象处理同一个请求,而处理者在运行时动态决定。通过创建一个处理类的抽象基类并由具体处理类继承,可以构建一个处理链。客户端将请求发送到链的开始,然后由各个处理者根据条件决定是否处理。这种模式降低了耦合度,增强了灵活性,但也可能导致请求未被接收或性能影响。
摘要由CSDN通过智能技术生成

一、定义

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

二、 责任链模式的使用场景

多个对象可以请求同一请求,但具体由哪个对象处理则在运行时候动态决定
在请求处理者不明确的情况下向多个对象中的一个提交一个请求
需要动态指定一组对象处理请求

责任链的UML

在这里插入图片描述

三、代码实现

定一个抽象的处理类 关键在与持有一个内部的自己引用

public  abstract class Handler {

    public Handler soccessor;

    public abstract void handleRequest(String condition);
}

我们定义两个链条 大概是根据逻辑判断是自己要处理还是交给其他人处理,如果自己处理就自己处理掉 如果别人处理是别人处理掉

public class ConcreteHandler1 extends Handler {
    @Override
    public void handleRequest(String condition) {
        if (condition.equals("ConcreteHandler1")) {//可以是你要处理的方法
            System.out.println("ConcreteHandler1 handler");
            return;
        } else {
            if (soccessor != null) {
                soccessor.handleRequest(condition);
            }
        }
    }
}

public class ConcreteHandler2 extends Handler {
    @Override
    public void handleRequest(String condition) {
        if (condition.equals("ConcreteHandler2")) {//可以是你要处理的方法
            System.out.println("ConcreteHandle2 handler");
            return;
        } else {
            if (soccessor != null) {
                soccessor.handleRequest(condition);
            }
        }
    }
}

我们看在客户端 把所有链条都生产出来 然后给链条指定后前后关系,然后就在开始的链条上开始请求,因为如果有没有处理会进行下一环节,如果有处理那么就交给当前去处理

public class Client 
    @TestOnly
    public void test() {

        ConcreteHandler1 concreteHandler1 = new ConcreteHandler1();
        ConcreteHandler2 concreteHandler2 = new ConcreteHandler2();
        concreteHandler1.soccessor = concreteHandler2;
        concreteHandler1.handleRequest("ConcreteHandler1");
    }

}

四、优缺点

优点
降低耦合度。它将请求的发送者和接收者解耦
简化了对象,使得对象不需要知道链的结构
增强给对象指派职责的灵活性,允许动态地新增或者删除责任链
增加新的请求处理类方便

缺点
不能保证请求一定被接收;
系统性能将受到一定影响,调试时不方便,可能会造成循环调用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值