设计模式系统回顾(11)责任链模式

目的:当一个请求在链路的头部发出时,会沿着链的路径依次传递给每一个节点对象,直到有对象处理这个请求为止
例:登录校验链路

public class LoginUser {
    private String loginName;//登录名
    private String password;//密码
    private String roleName;//角色
    private String permission;//权限

    public String getLoginName() {
        return loginName;
    }

    public void setLoginName(String loginName) {
        this.loginName = loginName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getRoleName() {
        return roleName;
    }

    public void setRoleName(String roleName) {
        this.roleName = roleName;
    }

    public String getPermission() {
        return permission;
    }

    public void setPermission(String permission) {
        this.permission = permission;
    }
}

//“链路”的抽象节点类
public abstract class MyHandler {
    protected MyHandler next;//持有下一个节点对象,也就是每个节点都需要知道自己的下一个节点是谁才能传递下去

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

    public abstract void doHandler(LoginUser loginUser);//执行每个节点的处理逻辑
}


//建造“链路”节点,校验账号密码节点类 
public class VerifyAccountHandler extends MyHandler {
    @Override
    public void doHandler(LoginUser loginUser) {//校验账号密码
        if (null == loginUser.getLoginName()){
            System.out.println("用户名不能为空");
            return;
        }
        if (null == loginUser.getPassword()){
            System.out.println("密码不能为空");
            return;
        }
        if (!loginUser.getPassword().equals("123456")){
            System.out.println("密码不正确");
            return;
        }
        System.out.println("账号密码校验通过");
        next.doHandler(loginUser);//传递给下一个节点
    }
}

//继续建造“链路”节点,校验角色信息节点类
public class VerifyRolehandler extends MyHandler {
    @Override
    public void doHandler(LoginUser loginUser) {
        if(!"admin".equals(loginUser.getRoleName())){//校验角色信息
            System.out.println("角色信息有误");
            return;
        }
        System.out.println("角色信息校验通过");
        next.doHandler(loginUser);//传递给下一个节点
    }
}
//继续建造“链路”节点,校验权限信息节点类
public class VerifyPermissionhandler extends MyHandler {
    @Override
    public void doHandler(LoginUser loginUser) {//校验权限
        if (!"admin".equals(loginUser.getPermission())){
            System.out.println("暂无权限");
            return;
        }
        System.out.println("权限校验通过,登录成功");
    }
}

//测试类
public class TestChain {
    public static void main(String[] args) {
        MyHandler accountHandler = new VerifyAccountHandler();
        MyHandler rolehandler = new VerifyRolehandler();
        MyHandler permissionhandler = new VerifyPermissionhandler();

        accountHandler.next(rolehandler);
        rolehandler.next(permissionhandler);

        LoginUser loginUser = new LoginUser();
        loginUser.setLoginName("孤狼1号");
        loginUser.setPassword("123456");
        loginUser.setRoleName("admin");
        loginUser.setPermission("admin");
        accountHandler.doHandler(loginUser);//从起点开始调用
    }
}

优点:
1.每个节点指处理自己的事情
2.链路灵活,可以新增或者删减责任
缺点:
1.链路过长影响性能

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值