职责链模式 / 责任链模式

基本介绍

1.一个抽象类公开定义了执行它的方法的方式/模板,它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行

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

 

角色

1.Handler:抽象处理者,定义了一个处理请求的方法,聚合另外一个 Handler(下一个具体处理者),依赖 Request

(1)一般通过在 Handler 中设置一个最大节点数量,在 setNext 方法中判断是否已经超过阀值,超过则不允许该链建立,避免出现超长链无意识地破坏系统性能

2.ConcreteHandler:具体处理者,处理自己负责的请求,同时可以访问它的后继者(即下一个处理者);如果可以处理请求,则进行处理,否则交给后继者去处理,从而形成一个职责链

3.Request:含复数属性,表示一个请求

 

事项

1.优点

(1)降低耦合度,将请求的发送者和接收者解耦

(2)简化对象,使得对象不需要知道链的结构

(3)增强给对象指派职责的灵活性,通过改变链内的成员或者调动它们的次序,允许动态地新增或者删除责任

(4)方便增加新的请求处理类

2.缺点

(1)不能保证请求一定被接收

(2)责任链比较长的时,系统性能将受到一定影响因此需控制链中最大节点数量

(3)类似递归,不容易观察运行时的特征,代码调试复杂

3.应用场景

(1)有多个对象可以处理同一个请求,具体哪个对象处理该请求由运行时刻自动确定

(2)在不明确指定接收者的情况下,向多个对象中的一个提交一个请求

(3)可动态指定一组对象处理请求

 

代码示例

public class Client {//客户端

    public static void main(String[] args) {
        Request request = new Request();
        request.setLevel(3);
        HandlerLevel1 handlerLevel1 = new HandlerLevel1();
        HandlerLevel2 handlerLevel2 = new HandlerLevel2();
        HandlerLevel3 handlerLevel3 = new HandlerLevel3();
        handlerLevel1.setNextHandler(handlerLevel2);
        handlerLevel2.setNextHandler(handlerLevel3);
        handlerLevel1.processRequest(request);
    }
}

class Request {//请求类
    private int level;//请求等级

    public int getLevel() {
        return level;
    }

    public void setLevel(int level) {
        this.level = level;
    }
}

abstract class AbstractHandler {
    protected AbstractHandler nextHandler;//下一个处理者

    public void setNextHandler(AbstractHandler nextHandler) {
        this.nextHandler = nextHandler;
    }

    public abstract void processRequest(Request request);
}

class HandlerLevel1 extends AbstractHandler {//具体处理者:等级1


    @Override
    public void processRequest(Request request) {
        if (request.getLevel() <= 1) {
            System.out.println("等级 1 处理者,成功处理请求");
        } else {
            System.out.println("处理请求失败,当前 level 自动提升 1 ");
            nextHandler.processRequest(request);
        }
    }
}

class HandlerLevel2 extends AbstractHandler {//具体处理者:等级2


    @Override
    public void processRequest(Request request) {
        if (request.getLevel() <= 2) {
            System.out.println("等级 2 处理者,成功处理请求");
        } else {
            System.out.println("处理请求失败,当前 level 自动提升 1 ");
            nextHandler.processRequest(request);
        }
    }
}

 

posted @   半条咸鱼  阅读(40)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示