职责链模式(Chain of Responsibility Pattern)

1.职责链模式(Chain of Responsibility Pattern):使多个对象都有机会处理请求,从而避免请求发送者与接收者耦合在一起。将这些对象连接成一条链,并且沿着这条链传递请求,直到有对象处理它为止。
2.类型:对象行为型模式
3.纯职责链
每个处理者接收到请求后,要么单纯转发请求,要么单纯处理请求。不允许既处理请求,又转发请求的情况。
请求必须被责任链上的某个处理者处理。不允许出现请求未被处理的情况
4…不纯职责链
每个处理者接收到请求后,除了单纯转发请求,或者单纯处理请求,还可以
部分处理请求后,转发完全处理请求后,转发给下个处理者
请求可以不被责任链上的任何处理者处理。
5.优点
遵守“迪米特法则”。请求发送者只负责创建链,不需要知道请求被哪个处理者处理,怎样处理。
遵守“开闭原则”,新增了一个处理者,只需要在客户端中重新建立链即可,原有系统不需要修改。
增强了灵活性。可以在运行时刻对职责链进行动态的增加或者修改。
6.缺点
请求不一定会被处理。无论是没有可以处理请求的接受者,还是责任链创建错误,都有可能导致请求不被处理。
可能造成死循环。责任链如果是环状的,可能会导致循环调用,造成死循环。

package 职责链模式;

import jdk.internal.org.objectweb.asm.Handle;

/*
Handler:抽象处理者
一般是抽象类。定义了处理请求的接口。
定义了请求处理抽象方法handleRequest(),规范了子类处理请求的操作。
为了将处理者组成一条链,抽象处理者需要返回一个本处理者的下个处理者的引用。
由于处理者的下方还是处理者,因此在抽象处理者中定义了一个抽象处理者类型的对象
(如结构图中的successor),作为下个处理者的引用(可选)。
ConcreteHandler:具体处理者
继承Handler的具体处理者角色。
实现了handleRequest()抽象方法来处理请求。
具体处理者接到请求后,如果可以处理就将请求处理掉;
否则通过对下个处理者的引用将请求转发给下个处理者。
 */
public class ChainOfResponsibilityPattern {
    public static void main(String[] args) {
        //组装职责链
        Handler handler1 = new ConcreteHandler1();
        Handler handler2 = new ConcreteHandler2();
       // handler2.setSuccessor(null);//最后一个节点successor域赋空或者给父节点直接赋
        handler1.setSuccessor(handler2);
        //提交请求
        handler1.handleRequest("adasdas");
        System.out.println("------------------");
        handler1.handleRequest("ac");
    }
}

abstract class Handler{
    protected Handler successor = null;

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

    public Handler getSuccessor(){
        return successor;
    }
    //传入请求
    public abstract void handleRequest(String judging);
}

class ConcreteHandler1 extends Handler{
    @Override
    public void handleRequest(String judging) {
        if (judging.length()<3){//长度小于3
            System.out.println(this.getClass().getSimpleName()+"处理请求");
        }else{
            System.out.println(this.getClass().getSimpleName()+"转发请求");
            if (this.successor!=null) {
                this.successor.handleRequest(judging);//转发请求
            }
        }
    }
}

class ConcreteHandler2 extends Handler{
    @Override
    public void handleRequest(String judging) {
        if (judging.length()>=3){//不是空
            System.out.println(this.getClass().getSimpleName()+"处理请求");
        }else{
            System.out.println(this.getClass().getSimpleName()+"转发请求");
            if (this.successor!=null) {
                this.successor.handleRequest(judging);//转发请求
            }
        }
    }
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值