设计模式之责任链模式
设计模式之责任链模式
责任链模式将链中每一个节点看着一个对象,每个节点处理不同的请求,且内部维护着下一个节点的对象,当一个请求从链式的首端出发,会沿著责任链预设的路径依次传递到每一个节点对象,直至被链中的某一个对象处理为止。
适用场景
-
当有多个对象可以处理同一个请求,但具体处理者在运行时确定。
-
当需要动态指定处理请求的对象时,可以使用责任链模式。
类图
代码演示
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 {
@Override
public void doHandle(UserInfo userInfo,List<String> list) {
log.info("恭喜您来到王者荣耀");
list.add("恭喜您来到王者荣耀");
}
}
LoginHandler类
@Slf4j
@Service
public class LoginHandler extends Handler {
@Override
public 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{
@Override
public 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 {
@Resource
private AuthHandler authHandler;
@Resource
private LoginHandler loginHandler;
@Resource
private 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就是演示如何把结果收集
原文地址:https://blog.csdn.net/m0_37635053/article/details/143062830
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!