策略模式和责任链模式(4)

简介: 策略模式和责任链模式(4)

image.png


从 UML类图中,我们可以看到,责任链模式主要包含两种角色:


抽象处理者(Handler):定义一个请求处理的方法,并维护一个下一个处理节点Handler对象的

引用;


具体处理者(ConcreteHandler):对请求进行处理,如果不感兴趣,则进行转发。


责任链模式的本质是解耦请求与处理,让请求在处理链中能进行传递与被处理;理解责任链模式应


当理解的是其模式(道 )而不是其具体实现(术 ),责任链模式的独到之处是其将节点处理者组合成了


链式结构,并允许节点自身决定是否进行请求处理或转发,相当于让请求流动了起来。


利用责任链模式进行数据校验拦截


首 先, 创建一个实体类Member :


@Data
public class Member {
    private String loginName;
    private String loginPass;
    private String roleName;
    public Member(String loginName, String loginPass) {
        this.loginName = loginName;
        this.loginPass = loginPass;
    }
}


然后来看一段我们经常写的代码:


public class MemberService {
    public static void main(String[] args) {
        MemberService service = new MemberService();
        service.login("tom", "666");
    }
    public void login(String loginName, String loginPass) {
        if (StringUtils.isEmpty(loginName) ||
                StringUtils.isEmpty(loginPass)) {
            System.out.println("用户名和密码为空");
            return;
        }
        System.out.println("用户名和密码不为空,可以往下执行");
        Member member = checkExists(loginName, loginPass);
        if (null == member) {
            System.out.println("用户不存在");
            return;
        }
        System.out.println("登录成功!");
        if (!"管理员".equals(member.getRoleName())) {
            System.out.println("您不是管理员,没有操作权限");
            return;
        }
        System.out.println("允许操作");
    }
    private Member checkExists(String loginName, String loginPass) {
        Member member = new Member(loginName, loginPass);
        member.setRoleName("管理员");
        return member;
    }
}


请问各位小伙伴,你们是不是经常这么干?上面的代码中,主要功能是做了登录前的数据验证,然

, 判断逻辑是有先后顺序的。首先做非空判断,然后检查账号是否有效,最终获得用户角色。然后根

据用户角色所拥有的权限再匹配是否有操作权限。那么这样的检验性代码一般都是必不可少的

, 但是写在具体的业务代码又显得代码非常臃肿,因此我们可以用责任链模式

, 将这些检查步骤串联起来,而且

不影响代码美观。可以使得我们在编码时可以更加专注于某一个具体的业务逻辑处理。


下面我们用责任链模式来优化一下代码,首先创建一个Handler类 :


public abstract class Handler {
    protected Handler next;
    public void next(Handler next){ this.next = next;}
    public abstract void doHandler(Member member);
}


我们分别创建非空校验ValidateHandler类、登录校验LoginHandler类和权限校验AuthHandler

类 ,来看代码ValidateHandler类 :


public class ValidateHandler extends Handler {
    public void doHandler(Member member) {
        if (StringUtils.isEmpty(member.getLoginName()) ||
                StringUtils.isEmpty(member.getLoginPass())) {
            System.out.println("用户名和密码为空");
            return;
        }
        System.out.println("用户名和密码不为空,可以往下执行");
        next.doHandler(member);
    }
}


LoginHandler 类:


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


AuthHandler 类:


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


接下来,修 改Memberservice中的代码,其实我们只需要将前面定义好的几个Handler根据业务需求串联起来,形成一条链即可


public class MemberService {
    public void login(String loginName, String loginPass) {
        Handler validateHandler = new ValidateHandler();
        Handler loginHandler = new LoginHandler();
        Handler authHandler = new AuthHandler();
        validateHandler.next(loginHandler);
        loginHandler.next(authHandler);
        validateHandler.doHandler(new Member(loginName, loginPass));
    }
}
目录
相关文章
|
4月前
|
设计模式 Dubbo Java
聊聊Java设计模式-责任链模式
责任链模式(Chain Of Responsibility Design Pattern),也叫做职责链,是将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。
84 1
聊聊Java设计模式-责任链模式
|
5月前
|
算法 数据安全/隐私保护
行为型 策略模式
行为型 策略模式
18 1
|
8月前
|
设计模式 Java
设计模式~~~责任链模式(职责链模式)
设计模式~~~责任链模式(职责链模式)
36 0
|
9月前
|
设计模式 Java
|
9月前
|
设计模式 存储 Java
设计模式-行为型模式:责任链模式
设计模式-行为型模式:责任链模式
|
10月前
|
设计模式 SpringCloudAlibaba 算法
Java设计模式(一):责任链模式
将请求的发送和接收解耦,让多个接收对象都有机会处理这个请求。将这些接收对象串成一条链,并沿着这条链传递这个请求,直到链上的某个接收对象能够处理它为止。实际上,责任链模式还有一种变体,那就是请求会被所有接收对象都能处理一遍,直到某个接收对象不能正常处理再退出,或者全部执行一遍,不存在中途终止的情况
192 0
Java设计模式(一):责任链模式
|
12月前
|
设计模式 Java
Java设计模式-责任链模式(ChainOfResponsibility)
Java设计模式-责任链模式(ChainOfResponsibility)
|
设计模式 Java
Java设计模式—责任链模式
Java设计模式—责任链模式
120 0
Java设计模式—责任链模式
|
设计模式 安全 Java
Java设计模式 ->责任链模式
Java设计模式 ->责任链模式
97 0
|
设计模式
【设计模式】行为型模式-第 3 章第 1 讲【责任链模式】
【设计模式】行为型模式-第 3 章第 1 讲【责任链模式】
【设计模式】行为型模式-第 3 章第 1 讲【责任链模式】