设计模式之----Java责任链模式和建造者模式结合使用

上篇介绍了简单的责任链模式的业务场景和使用,在实际的代码中,可能需要结合多种进行使用才会更好。
上篇文章的在service的实现就写的很臃肿,必须指定next,这些在业务场景中都是不能做到很优雅的处理业务。
接下来就是对上一篇的责任链模式进行改造,引入建造者模式。
建构者模式:
建造者设计模式的核心在于隐藏内部构建细节,通过外部的Builder来实现构建。Builder负责Product类对象的具体过程构建,Director负责指导Build,要求Builder按照其指定的顺序去完成Produt的构造。最后通过Builder返回建造后的结果。
之所以说建造者模式常用,用的最多的就是存在与三方框架,因为三方框架中包含的实现细节比较多,所以为了不给外部看到内部的实现细节,同时又能给用户更好的扩展,代码又整洁,只有通过这种方式才能实现此目的。
具体代码实现:
开始的业务代码和上一篇文章一样。
1.实体

@Data
public class Member implements Serializable {
    
    

    public String loginName;

    public String password;

    public String roleName;

    public Member(String loginName, String password) {
    
    
        this.loginName = loginName;
        this.roleName = password;
    }

}

在这里插入图片描述
2.Handler实现。 这里就会和上偏的不一样,会多进行构建者的Builder的定义

public abstract class Handler<T> {
    
    

    protected Handler next;

    public void next(Handler next){
    
    
        this.next = next;
    }


    public abstract void doHandler(Member member);

    public static class Builder<T> {
    
    
        private Handler<T>  head;
        private Handler<T> tail;

        public Builder<T> addHandler(Handler<T> handler){
    
    
            if(this.head == null){
    
    
                this.head = this.tail =handler;
                return this;
            }
            this.tail.next(handler);
            this.tail = handler;
            return  this;
        }

        public Handler<T> build(){
    
    
            return this.head;
        }

    }
}

在这里插入图片描述
3.各自业务模块的业务实现不变
3.1校验参数

public class ValidateHandler extends Handler {
    
    

    @Override
    public void doHandler(Member member) {
    
    
         String loginName = member.getLoginName();
         if(StringUtils.isEmpty(loginName)){
    
    
             System.out.println("用户名和密码为空");
             return;
         }
         System.out.println("用户名和密码不为空的可以往下执行");
    }

}

在这里插入图片描述
3.2登录业务

public class LoginHandler extends Handler {
    
    
    @Override
    public void doHandler(Member member) {
    
    
        System.out.println("登录成功");
        member.setRoleName("管理员");
        next.doHandler(member);
    }
}

在这里插入图片描述
3.3权限业务的处理

public class AuthHandler extends Handler {
    
    
    @Override
    public void doHandler(Member member) {
    
    
        if(!"管理员".equals(member.getRoleName())){
    
    
            System.out.println("您不是管理员,没有操作权限");
            return;
        }
        System.out.println("允许操作");
        next.doHandler(member);
    }

}

在这里插入图片描述
4.业务代码的实现,现在我们可以体会到构建者模式在此处帮我们处理的代码。

public class MemberService {
    
    

    public  void  login(String loginName,String password){
    
    

        Handler.Builder builder = new Handler.Builder();
        builder.addHandler(new ValidateHandler())
                .addHandler(new LoginHandler())
                .addHandler(new AuthHandler());
        builder.build().doHandler(new Member(loginName,password));


    }

}

在这里插入图片描述
5.通过代码进行测试

public class Test {
    
    

    public static void main(String[] args) {
    
    
        MemberService memberService = new MemberService();
        memberService.login("tom","666");
    }
}

在这里插入图片描述

总结:
责任链模式的优点:

  • 1.将请求与处理解耦;
  • 2.请求处理者(节点对象)只需要关注自己感兴趣的请求进行处理即可,对于不感兴趣的请求,转发给下一个节点
  • 3.具备链式传递处理请求功能,请求发送者无需知晓链路结构,只需等待请求处理结果
  • 4.链路结构灵活,可以通过改变链路的结构动态的新增或删减责任;
  • 5.易于扩展新的请求处理类(节点),符合开闭原则

缺点:

  • 1.责任链太长或者处理时间过长,会影响整体性能
  • 2.如果节点对象存在循环引用时,会造成死循环,导致系统崩溃

Guess you like

Origin blog.csdn.net/qq_35529931/article/details/121592834