设计模式之责任链模式
责任链模式将链中每一个节点看着一个对象,每个节点处理不同的请求,且内部维护着下一个节点的对象,当一个请求从链式的首端出发,会沿著责任链预设的路径依次传递到每一个节点对象,直至被链中的某一个对象处理为止。
适用场景
-
当有多个对象可以处理同一个请求,但具体处理者在运行时确定。
-
当需要动态指定处理请求的对象时,可以使用责任链模式。
类图
代码演示
step 1 写一个抽象类,作为父类
public abstract class Handler {protected Handler handler;public void next(Handler handler) {this.handler = handler;}public abstract void doHandle(UserInfo userInfo,List<String> list);
}
step 2 写3个实现类
AuthHandler 类
@Slf4j
@Service
public class AuthHandler extends Handler {@Overridepublic void doHandle(UserInfo userInfo,List<String> list) {log.info("恭喜您来到王者荣耀");list.add("恭喜您来到王者荣耀");}
}
LoginHandler类
@Slf4j
@Service
public class LoginHandler extends Handler {@Overridepublic void doHandle(UserInfo userInfo,List<String> list) {if(!userInfo.getUserName().equals("张三")||!userInfo.getPassword().equals("666666")){log.info("登录失败");return;}log.info("登录成功");list.add("登录成功");handler.doHandle(userInfo,list);}
}
ValidateHandler 类
@Slf4j
@Service
public class ValidateHandler extends Handler{@Overridepublic void doHandle(UserInfo userInfo,List<String> list) {if(StringUtils.isBlank(userInfo.getUserName())||StringUtils.isBlank(userInfo.getPassword())){log.error("账号密码不能为空………………");return;}log.info("校验通过");list.add("校验通过");handler.doHandle(userInfo,list);}
}
step 3 责任链类
这里是为了把对象组装成链
@Slf4j
@Service
public class HandleService {@Resourceprivate AuthHandler authHandler;@Resourceprivate LoginHandler loginHandler;@Resourceprivate ValidateHandler validateHandler;public void login(String username, String password) {//通过此方法,会让ValidateHandler 类拥有一个指向loginHandler的Handler对象validateHandler.next(loginHandler);//通过此方法,会让LoginHandler类拥有一个指向authHandler的Handler对象loginHandler.next(authHandler);UserInfo userInfo = new UserInfo();userInfo.setUserName(username);userInfo.setPassword(password);List<String> list = new ArrayList<>();validateHandler.doHandle(userInfo,list);log.info("list的内容:{}",list);}
}
结束语
当业务代码调用HandleService
的login方法时,就会按照我们预设的顺序,validateHandler->loginHandler->authHandler
依次调用方法,这里的参数list就是演示如何把结果收集