责任链模式

发布时间 2023-06-25 15:54:44作者: 弘一

责任链模式

责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。

这种模式给予请求的类型,对请求的发送者和接收者进行解耦。

这种类型的设计模式属于行为型模式

使用登录例子:

  • 成员定义
package org.kouhao.design.patterns.责任链模式;

/**
 * @author admin
 */
public class Member {
    private String loginName;
    private String loginPass;
    private String roleName;

    public Member(String loginName, String loginPass) {
        this.loginName = loginName;
        this.loginPass = loginPass;
    }

    public String getLoginName() {
        return loginName;
    }

    public String getLoginPass() {
        return loginPass;
    }

    public String getRoleName() {
        return roleName;
    }

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

    @Override
    public String toString() {
        return "Member{" +
                "loginName='" + loginName + '\'' +
                ", loginPass='" + loginPass + '\'' +
                '}';
    }
}
  • 抽象处理类
package org.kouhao.design.patterns.责任链模式;

/**
 * @author admin
 */
public abstract class AbstractHandler {
    protected AbstractHandler chain;

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

    public abstract void doHandle(Member member);
}

  • 实现抽象类1
package org.kouhao.design.patterns.责任链模式;

/**
 * 非空校验类
 *
 * @author admin
 */
public class ValidateHandler extends AbstractHandler {
    @Override
    public void doHandle(Member member) {
        if (member.getLoginName() == null ||
                member.getLoginPass() == null) {
            System.out.println("用户名或者密码为空");
            return;
        }
        System.out.println("用户名和密码校验成功,可以往下执行");
        chain.doHandle(member);
    }
}
  • 实现抽象类2
package org.kouhao.design.patterns.责任链模式;

/**
 * 登录校验
 *
 * @author admin
 */
public class LoginHandler extends AbstractHandler {
    @Override
    public void doHandle(Member member) {
        System.out.println("登录成功!");
        member.setRoleName("管理员");
        chain.doHandle(member);
    }
}
  • 实现抽象类3
package org.kouhao.design.patterns.责任链模式;

/**
 * 权限校验
 *
 * @author admin
 */
public class AuthHandler extends AbstractHandler {
    @Override
    public void doHandle(Member member) {
        if (!"管理员".equals(member.getRoleName())) {
            System.out.println("您不是管理员,没有操作权限");
            return;
        }
        System.out.println("您是管理员,允许操作");
    }
}
  • 责任链组装
package org.kouhao.design.patterns.责任链模式;

/**
 * @author admin
 */
public class MemberService {
    public void login(String loginName, String loginPass) {
        AbstractHandler validateHandler = new ValidateHandler();
        AbstractHandler loginHandler = new LoginHandler();
        AbstractHandler authHandler = new AuthHandler();

        validateHandler.next(loginHandler);
        loginHandler.next(authHandler);

        validateHandler.doHandle(new Member(loginName, loginPass));
    }
}
  • 客户端
package org.kouhao.design.patterns.责任链模式;

/**
 * @author admin
 */
public class Client {
    public static void main(String[] args) {
        new MemberService().login("admin", "Admin@123");
    }
}
  • 输出

用户名和密码校验成功,可以往下执行
登录成功!
您是管理员,允许操作

责任链模式和建造者模式结合使用

负责组装链式结构的角色是MemberService,当链式结构较长时,MemberService的工作会非常烦琐,并且MemberService的代码相对臃肿,且后续更改处理者或消息类型时,都必须在MemberService中进行修改,不符合开闭原则。