行为型模式 08 职责链模式

职责链模式Chain of Responsibility

使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合。将这个对象连成一条链,并沿着这条俩传递该请求,直到有一个对象处理它为止
在这里插入图片描述
Handler:抽象处理者,定义抽象处理方法以及对下一个处理者的引用,一般为抽象类
ConcreteHandler:具体处理者,既能处理也能传递请求,持有下一个ConcreteHandler的引用

使用场景

多个对象对于同一个问题有着不同的处理方式。

发送者与接收者互相不认识,链中的对象也仅仅知道自己的下家,而不清楚整个链的具体结构,降低耦合

与状态模式

状态模式:状态模式是把原来类中的针对自身不同状态的行为独立出去,作为类,是一个类对于不同状态的多种不同响应,状态迁移的顺序已经决定,不允许客户端进行操作改变顺序

职责链模式是不同类对于一个问题的不同处理,责任类不需要知道自己的下一个类是什么可以;在客户端或环境类中对链进行组装,组合成不同的链更为灵活

最大区别:状态模式的子类仅仅能处理问题和改变环境类的状态属性,而不执行下个状态的方法(并不持有下个类的引用),由环境类执行方法; 而职责类中的每个类即负责处理问题,也负责递交问题(持有下个类引用,并调用其方法);
一个是从问题的角度,一个是从处理者的角度

与策略模式

责任链 :多个对象对于同一个问题有着不同的处理方式,使多个对象都有机会处理请求;
策略: 一个对象对于一个问题有着不同的处理方式,从而产生的多种算法。
状态:一个对象(问题)对于自身的状态产生不同的响应

实例

Handler:持有Handler引用,拥有用于设置下个链的方法

public abstract class Handler {
    protected Handler nextHandler;
    public void setNextHandler(Handler handler){
        this.nextHandler = handler;
    }
    public abstract void HandlerRequest(int request);
}

ConcreteHandler:具体的处理行为

public class ConcreteHandlerA extends Handler{
    @Override
    public void HandlerRequest(int request) {
        if (request<10){
            System.out.println("A成功处理");
        }else {
            System.out.println("A不能处理 ,提交给下一级处理");
            super.nextHandler.HandlerRequest(request);
        }
    }
}

public class ConcreteHandlerB extends Handler {
    @Override
    public void HandlerRequest(int request) {
        if (request<20){
            System.out.println("B成功处理");
        }else {
            System.out.println("B不能处理 ,提交给下一级处理");
            super.nextHandler.HandlerRequest(request);
        }
    }
}

public class ConcreteHandlerC extends Handler{

    @Override
    public void HandlerRequest(int request) {
        System.out.println("C处理");
    }
}

Test:在客户端或环境类中为链组合

public class Test {
    public static void main(String[] args) {
        Handler h1 = new ConcreteHandlerA();
        Handler h2 = new ConcreteHandlerB();
        Handler h3 = new ConcreteHandlerC();
//        设置链
        h1.setNextHandler(h2);
        h2.setNextHandler(h3);
//        使用链处理问题
        h1.HandlerRequest(30);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值