通过构建一条流水线,将一个申请依照程序进行屡次解决

上面应用一个登录的例子来实现责任链模式

申请体类

public class UserInfo {    private String username;    private String password;    private String role;    public String getUsername() {        return username;    }    public void setUsername(String username) {        this.username = username;    }    public String getPassword() {        return password;    }    public void setPassword(String password) {        this.password = password;    }    public String getRole() {        return role;    }    public void setRole(String role) {        this.role = role;    }}

形象解决类

public abstract class Handler {    Handler next;    public void setNext(Handler handler){        this.next = handler;    }    public abstract void handle(UserInfo info);}

具体处理过程 验证明码 → 权限验证

public class LoginHandler extends Handler{    @Override    public void handle(UserInfo info) {        if ("eacape".equals(info.getUsername()) && "123456".equals(info.getPassword())){            System.out.println("明码验证通过");            super.next.handle(info);        }else {            throw new RuntimeException("账户或明码谬误");        }    }}
public class RoleHandler extends Handler{    @Override    public void handle(UserInfo info) {        if ("1".equals(info.getRole())){            System.out.println("登录胜利");        }else {            throw new RuntimeException("暂无权限");        }    }}

测试

public class ChainTest {    @Test    public void test(){        UserInfo info = new UserInfo();        info.setUsername("eacape");        info.setPassword("123456");        info.setRole("1");        Handler login = new LoginHandler();        login.setNext(new RoleHandler());        login.handle(info);    }}======后果======明码验证通过登录胜利

能够与建造者模式联合用于构建调用链

形象解决类 & 结构者

public abstract class HandlerBuilder {    HandlerBuilder next;    public abstract void handle(UserInfo info);    public static class  Builder{        private HandlerBuilder tail;        private HandlerBuilder head;        public Builder addHandler(HandlerBuilder handler){            if (head == null){                head = tail = handler;            }else {                tail.next = handler;                tail = tail.next;            }            return this;        }        public HandlerBuilder build(){            return this.head;        }    }}

具体处理过程

public class LoginHandler extends HandlerBuilder {    @Override    public void handle(UserInfo info) {        if ("eacape".equals(info.getUsername()) && "123456".equals(info.getPassword())){            System.out.println("明码验证通过");            super.next.handle(info);        }else {            throw new RuntimeException("账户或明码谬误");        }    }}
public class RoleHandler extends HandlerBuilder {    @Override    public void handle(UserInfo info) {        if ("1".equals(info.getRole())){            System.out.println("登录胜利");        }else {            throw new RuntimeException("暂无权限");        }    }}

测试

public class ChainTest {    @Test    public void test(){        UserInfo info = new UserInfo();        info.setUsername("eacape");        info.setPassword("123456");        info.setRole("1");        HandlerBuilder builder = new HandlerBuilder.Builder()                .addHandler(new LoginHandler())                .addHandler(new RoleHandler())                .build();        builder.handle(info);    }}======后果======明码验证通过登录胜利