目的:当一个请求在链路的头部发出时,会沿着链的路径依次传递给每一个节点对象,直到有对象处理这个请求为止
例:登录校验链路
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.链路过长影响性能