(15) Modelo de Cadeia de Responsabilidade
O padrão Chain of Responsibility considera cada nó na cadeia como um objeto, cada nó é responsável por processar diferentes solicitações e mantém automaticamente o próximo objeto nó internamente. Por meio do modo de cadeia de responsabilidade, o desacoplamento é bem realizado e os nós de objeto são responsáveis por sua própria responsabilidade.
1. Princípios de Design de Padrão de Cadeia de Responsabilidade
Abstract Handler: Defina um método de processamento de solicitação e mantenha uma referência para o próximo nó do objeto de processamento;
Manipulador concreto (ConcreateHandler): Processe a solicitação.
2. Exemplo simples
Na lógica de negócios de login, as informações do usuário precisam ser verificadas, julgadas, autenticadas e outras operações.Usando o modo de cadeia de responsabilidade, cada processador pode cooperar entre si para concluir o processamento de negócios de login.
public abstract class Handler {
protected Handler chain;
// 负责将当前获取对象置为全局对象
public void next(Handler handler){
this.chain = handler;
}
// 自己的业务逻辑处理
public abstract void doHandler(Member member);
}
public class ValidHandler extends Handler {
@Override
public void doHandler(Member member) {
if(null == member.getUsername() || null ==member.getPassword()){
System.out.println("用户名或密码为空!");
return;
}
System.out.println("用户名密码校验成功!");
chain.doHandler(member);
}
}
public class LoginHandler extends Handler {
@Override
public void doHandler(Member member) {
System.out.println("登录成功!");
member.setInfo("管理员");
chain.doHandler(member);
}
}
public class AuthHandler extends Handler {
@Override
public void doHandler(Member member) {
if(!"管理员".equals(member.getInfo())){
System.out.println("您不是管理员,没有操作权限!");
return;
}
System.out.println("欢迎管理员!");
}
}
public class Member {
private String username;
private String password;
private String info;
public Member(String username, String password, String info) {
this.username = username;
this.password = password;
this.info = info;
}
//getter,setter
}
public class MemberService {
public void login(String username,String password){
ValidHandler validHandler = new ValidHandler();
LoginHandler loginHandler = new LoginHandler();
AuthHandler authHandler = new AuthHandler();
// 责任链模式的业务处理顺序,分别指定各处理器的当前对象
validHandler.next(loginHandler);
loginHandler.next(authHandler);
validHandler.doHandler(new Member(username,password,"管理员"));
}
}
public class Client {
public static void main(String[] args) {
MemberService memberService = new MemberService();
memberService.login("lsk","123");
}
}
3. Avaliação do Modelo de Cadeia de Responsabilidade
O modo de cadeia de responsabilidade pode realizar a dissociação de solicitação e processamento e, ao mesmo tempo, pode ser tratado de forma flexível e pode ser expandido dinamicamente. Uma longa cadeia de responsabilidade também pode levar a tempos de processamento mais longos e sistemas complexos.