通過構建一條流水線,將一個請求按照順序進行多次處理
下面使用一個登錄的例子來實現責任鏈模式
請求體類
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);
}
}
======結果======
密碼驗證通過
登錄成功