责任链模式解析

为什么有责任链模式

传统的软件模式,用户发起请求,需要知道这个请求具体是有谁来处理,如果整个请求处理流程实际多个处理者,那么用户发起请求就需要知道所有的请求者。

这样的缺点就是向用户暴露了太多的内部细节,不安全,而且也造成了系统的复杂性。

责任链模式就是解决这个问题。

责任链的核心就是作为请求者不需要知道请求是由谁来处理的,只需要把请求发给第一个处理者,最终会返回一个处理后的结果。

责任链模式屏蔽了请求的处理过程,发起的请求到底是由谁来处理的,不需要关心。

责任链在实际应用场景

一:比如在用户存钱。

一个存款请求,一个处理者,只能处理人民币。 但是随着业务的发展,请求者的数量增加,处理的类型也增加了,还需要处理美元,欧元,日元等。

这个时候就可以用责任链模式,在第一个处理者后面添加一个链,如果是存人民币,就仍然使用第一个业务逻辑来处理,如果是美元就传递给第二个处理逻辑来处理,如果是日元,欧元,依次传递下去。

这样的好处是,只需要扩展实现类就可以解决需求变更的问题,不需要对原有的业务逻辑做大的更改。

二:用户注册

业务需求:在页面上有用户注册功能:
注册用户分两种: VIP用户和普通用户

  • 一:VIP用户,已经办理过业务。
    VIP用户比普通用户多一个输入项: VIP序列号。注册之后还需要激活。
    VIP用户的激活流程也比较特殊:VIP是自动发送到用户的邮箱中,就算激活成功。

  • 二:普通用户:注册需要填写一系列信息,不需要VIP序列号。
    激活,需要短信验证码。因为这样可以获得用户手机号,这样就可以给用户发送广告短信,哈哈哈。

这个场景就可以使用责任链模式。
从前台传递过来的用户信息,无论是VIP用户,还是普通用户,统一传递到一个接口,通过责任链完成任务的处理。

比如定义一个RegisterAction类,把通过HTTP传递过来的对象进行组装,组装成一个HashMap类型的对象UserInfoMap,传递给Handler接口的两个实现类。
具体由哪一个类来处理,根据HashMap上的用户表示来决定。

责任链模式的代码示例

分为抽象类,具体实现类,几个属性类,最后场景类:

抽象类

package com.company.ChainOfResponsibiliyPattern;
/*
抽象处理者:
然后在需要定义几个具体的实现者,几个实现类
 */
public abstract class Handler {
    private Handler nextHandler;
    //每个处理者都必须对请求作出处理
    public final Response handlerMessage(Request request) {
        Response response = null;
        //判断是否是自己的处理级别
        if(this.getHandlerLevel().equals(request.getRequestLevel())) {
            response = this.echo(request);
        }
        else {//不属于自己的级别
            //判断是否有下一个处理者
            if(this.nextHandler != null) {
                response = this.nextHandler.handlerMessage(request);
            }
            else {
                //如果没有下一个处理者,业务自行处理
            }

        }
        return response;
    }
    //设置下一个处理者是谁
    public void setNext(Handler handler2) {
        this.nextHandler = handler2;
    }
    //每个处理者都有一个处理级别
    protected abstract Level getHandlerLevel();
    //每个处理者都必须实现处理任务
    protected abstract Response echo(Request request);
}

具体实现类

package com.company.ChainOfResponsibiliyPattern;

public class ConcreteHandler1 extends Handler{
    //定义自己的处理逻辑
    protected Response echo(Request request) {
        //完成处理逻辑
        return null;
    }
    //设置自己的处理级别
    protected Level getHandlerLevel() {
        //设置自己的处理级别
        return null;
    }
}

package com.company.ChainOfResponsibiliyPattern;

public class ConcreteHandler2 extends Handler{
    //定义自己的处理逻辑
    protected Response echo(Request request) {
        //完成处理逻辑
        return null;
    }
    //设置自己的处理级别
    protected Level getHandlerLevel() {
        //设置自己的处理级别
        return null;
    }
}

package com.company.ChainOfResponsibiliyPattern;

public class ConcreteHandler3 extends Handler{
    //定义自己的处理逻辑
    protected Response echo(Request request) {
        //完成处理逻辑
        return null;
    }
    //设置自己的处理级别
    protected Level getHandlerLevel() {
        //设置自己的处理级别
        return null;
    }
}

几个属性类

package com.company.ChainOfResponsibiliyPattern;
/*
负责定义请求和处理级别
 */
public class Level {
    //定义一个请求和处理级别
}


package com.company.ChainOfResponsibiliyPattern;
/*
功能: 负责封装请求
 */
public class Request {
    //请求的等级
    public Level getRequestLevel() {
        return null;
    }
}

package com.company.ChainOfResponsibiliyPattern;
/*
功能: 负责封装链中返回的结果
 */
public class Response {
    //负责封装链中返回的结果
}



场景类

package com.company.ChainOfResponsibiliyPattern;
/*
场景类: 在场景类当中,对链进行组装
 */
public class Client {
    public static void main(String[] args) {
        //声明所有的处理节点
        Handler handler1 = new ConcreteHandler1();
        Handler handler2 = new ConcreteHandler2();
        Handler handler3 = new ConcreteHandler3();
        //设置链当中,不同阶段的顺序 1 --》 2 -- 》 3
        handler1.setNext(handler2);
        handler2.setNext(handler3);
        //提交请求,返回结果
        Response response = handler1.handlerMessage(new Request());
    }
}

参考书籍

《设计模式之禅》 秦小波

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值