大话编程-责任链模式

责任链模式(Chain of Responsibility Pattern)

使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理他为止。

动机

每一个处理对象决定它能处理哪些命令对象,它也知道如何将它不能处理的命令对象传递给该链中的下一个处理对象。给多个对象处理一个请求的机会,从而解耦发送者和接受者。该请求沿着对象链传递直至其中一个对象处理它。

使用场景

  • 有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。

  • 你想在不明确指定接受者的情况下,向多个对象的一个提交一个请求。

  • 可处理一个请求的对象集合应被动态的指定。

结构

image.png

代码示例

//处理请求的抽象类
public abstract class Handler {

    protected Handler successor;

    public void setSuccessor(Handler successor) {
        this.successor = successor;
    }
    
    public abstract void HandleRequest(int i);
}
//具体处理者
public class SparnHandler extends Handler {
    @Override
    public void HandleRequest(int i) {
        if (i < 30) {
            System.out.println("Sparn 来处理");
        } else {
            successor.HandleRequest(i);
        }
    }
}
//具体处理者
public class FanHandler extends Handler {
    @Override
    public void HandleRequest(int i) {
        if (i < 60) {
            System.out.println("Fan 来处理");
        } else {
            successor.HandleRequest(i);
        }
    }
}
//具体处理者
public class ComplalnHandler extends Handler {
    @Override
    public void HandleRequest(int i) {
        if (i < 80) {
            System.out.println("Complaln 来处理");
        } else {
            successor.HandleRequest(i);
        }
    }
}
//具体处理者
public class NewLocHandler extends Handler {
    @Override
    public void HandleRequest(int i) {
        if (i < 99) {
            System.out.println("NewLoc 来处理");
        } else {
            successor.HandleRequest(i);
        }
    }
}
public class Client{
    public static void main(String[] args) {
        Handler sparn = new SparnHandler();
        Handler fan = new FanHandler();
        Handler complaln = new ComplalnHandler();
        Handler newLoc = new NewLocHandler();
        
        //指定下一个处理者,应加个额外处理者,确保每个请求都能被处理
        sparn.setSuccessor(fan);
        fan.setSuccessor(complaln);
        complaln.setSuccessor(newLoc);

        sparn.HandleRequest(50);
    }
}

: Fan 来处理

总结

此模式使得一个对象无需指定是其他的哪一个对象处理请求。对象仅需要知道该请求是否会被正确的处理。接受者和发送者都没有对方的明确信息,且链中的对象不需知道链的结构。责任链可简化对象的相互链接,它们仅需要保持一个指向其后继者的引用,而不需保持它所以的候选者的应用。

大话编程那些事儿 wechat
欢迎关注微信公众号

访问更多文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值