通过构建一条流水线,将一个申请依照程序进行屡次解决
上面应用一个登录的例子来实现责任链模式
申请体类
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); }}======后果======明码验证通过登录胜利