自学内容网 自学内容网

设计模式之责任链模式

设计模式之责任链模式

责任链模式将链中每一个节点看着一个对象,每个节点处理不同的请求,且内部维护着下一个节点的对象,当一个请求从链式的首端出发,会沿著责任链预设的路径依次传递到每一个节点对象,直至被链中的某一个对象处理为止。

适用场景

  • 当有多个对象可以处理同一个请求,但具体处理者在运行时确定。

  • 当需要动态指定处理请求的对象时,可以使用责任链模式。

类图

在这里插入图片描述

代码演示

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)!