上篇介绍了简单的责任链模式的业务场景和使用,在实际的代码中,可能需要结合多种进行使用才会更好。
上篇文章的在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.如果节点对象存在循环引用时,会造成死循环,导致系统崩溃