设计模式之:责任链模式

本文通过一个登录验证的例子,详细介绍了责任链模式的实现,包括用户判断、账号密码验证和验证码校验三个步骤。首先定义了一个抽象Handler类,然后创建了三个具体的Handler类分别对应这三个步骤。接着,通过建造者模式简化了责任链的构建,使得添加或调整处理顺序更加方便。测试类展示了如何使用建造者模式构建责任链并启动流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

顾名思义,责任链就是将多个处理单元串成链路,是一种行为模式

1:需要顶一个抽象类或者接口,此抽象类定义一个处理业务功能函数

2:定义一个此抽象类变量,比如通过next函数来链接下一个 需要处理业务对象,以此链接

3:定义具体处理业务对象并继承抽象类

4:按照需求从某个初始化的业务对象开始,以此递归,直到所有责任对象业务处理完毕

下面我们以登录作为例子,来具体说说责任链模式应用。

登录过程一般经历下面几个流程:用户判断----账号密码判断----验证码校验

# Handler

public abstract class Handler {
    protected Handler next;
    
    public abstract void doHandler(Member member);

    public void next(Handler handler) {

        this.next = handler;
    }


}
# AuthHandler 密码模块验证

public class AuthHandler extend Handler {

    @Override
    public void doHandler(Member member) {
        if (checkUsernameAndPwd(member.getUsername(),member.getPassword())) {
            System.out.println("用户名密码成功");
            if (next != null){
                //  密码模块的 next链接 验证码模块 Handler
                next.doHandler(member);
            }
        }else {
            System.err.println("用户名或密码错误");
        }
    }

}
#CodeHandler : 验证码业务处理

public class CodeHandler extends Handler {
    @Override
    public void doHandler(Member member) {
        if (checkCode(member.getCode())) {
            System.out.println("验证码校验通过");

            // codeHandler 已经是登录流程的最后一步,next没有链接下一个Handler,所义next为空
            if(next != null){
                
                next.doHandler(member); 
            }
        }else {
            System.err.println("验证码校验失败");
        }
    }
}
# UserHandler 用户名功能模块
public class UserHandler extends Handler {

    @Override
    public void doHandler(Member member) {
        if (checkUser(member.getUsername())) {
            System.out.println("用户存在,校验通过");
            if (next != null) {
                // 用户名功通过过,下一步是 密码AuthHandler模块,next指向 AuthHandler
                next.doHandler(member);
            }
        } else {
            System.err.println("用户不存在,请求非法");
        }
    }

}

上面完成了,责任链模式中各个业务功能具体实现,下面就是需要一个初始化来开启。

# Test 测试责任链模式
public class Test {
    public static void main(String[] args) {
        Handler authHandler = new AuthHandler();
        Handler codeHandler = new CodeHandler();
        Handler userHandler = new UserHandler();

        // 用户 -》密码 -》验证码
        // 我们按照上面的顺序来写

        userHandler.next(authHandler); // userHandler的下一步指向保留AuthHandler引用
        authHandler.next(codeHandler); // AuthHandler的下一步指向保留CodeHandler 引用

        Member member = new Member();
        member.setCode("123");
        member.setUsername("cff");
        member.setPassword("123");

        userHandler.doHandler(member); // 通过UserHandler来开启整个流程
    }
}

看来上述责任链基本写法,你可能会说这有点简单把,如果增加责任链对像,那么岂不是要添加next对象,而且也没有体现出 递和归的思想啊。

下面来看看进阶版责任链模式(配合建造者模式使用)

public abstract class Handler {

    protected Handler next = null;

    public abstract void doHandler(Member member);

    public void next(Handler handler) {
        this.next = handler;
    }

    public static class Builder {
        private Handler header = null; // 头部Handler
        private Handler tail = null;  // 尾部 Handler

        public Builder add(Handler handler) {
            if (this.header == null) {
                this.header = this.tail = handler;
            } else {
                tail.next = handler;
                tail = handler; // 每次通过add 给责任链添加 Handler,并以此作为链条 tail
            }
            return this;
        }

        public Handler build() {
            return this.header;  // 返回 Head Handler 就是上面 userHandler来启动责任链
        }
    }
}
public class Test {
    public static void main(String[] args) {
        Handler authHandler = new AuthHandler();
        Handler codeHandler = new CodeHandler();
        Handler userHandler = new UserHandler();

        // 用户 -》密码 -》验证码
        // 我们按照上面的顺序来写
        Member member = new Member();
        member.setCode("123");
        member.setUsername("cff");
        member.setPassword("123");

		//大家看看这里 是不是非常舒适
        Handler.Builder builder = new Handler.Builder();
        builder.add(userHandler).add(authHandler).add(codeHandler);
        Handler handler = builder.build();
        handler.doHandler(member);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值