设计模式之责任链模式

系列文章目录

第一篇:设计模式之观察者模式
第二篇:设计模式之代理模式
第三篇:设计模式之责任链模式
第四篇:设计模式之建造者模式



前言

顾名思义,责任链模式就是一个和链路相关的模块,就像我们的请求,要经过多层拦截器,过滤器才能到达我们的业务层处理逻辑。说得通俗一点,就像我们的闯关游戏一样,需要一层一层来

在这里插入图片描述

何时使用:在处理消息或者对数据请求要经过很多道逻辑进行过滤的时候。

如何解决:拦截的类都实现统一接口。


提示:以下是本篇文章正文内容,将用两种方式实现责任链模式

一、责任链模式

例如,下面有一个用户,有两个过滤器,我们需要同时检查用户是否登录和用户名的长度是否大于20

实现一

定义过滤器接口

public interface Filter {
    void doFilter(User s);
}

定义登录过滤器实现类

public class LoginFilter implements Filter {
    @Override
    public void doFilter(User u) {
        System.out.println("Filter1" + (u.getState() == 1 ? "登录" : "未登录"));
    }
}

定义长度过滤器实现类

public class LengthFilter implements Filter{
    @Override
    public void doFilter(User u) {
        if (u.getName().length() > 20)  System.out.println("Filter2" + "长度大于20");
        else  System.out.println("Filter2" + "长度不大于20");
    }
}

定义过滤器责任链

public class FilterChain implements Filter{

    List<Filter> filterList = new ArrayList<>();

    public FilterChain add(Filter filter){
        filterList.add(filter);
        return this;
    }

    @Override
    public void doFilter(User user, FilterChain chain) {
        for (Filter x : filterList) {
            x.doFilter(s);
        }
    }
}

测试

public static void main(String[] args) {

        FilterChain chain = new FilterChain();
        chain.add(new LoginFilter()).add(new LengthFilter());

        User user = new User();
        user.setName("这是一个测试责任链模式的程序*");
        user.setState(0);
        chain.doFilter(user);
    }

实现二

定义过滤器接口

public interface Filter {
    void doFilter(User user, FilterChain chain);
}

定义登录过滤器实现类

public class LoginFilter implements Filter {
    @Override
    public void doFilter(User u, FilterChain chain) {
        System.out.println("Filter1" + (u.getState() == 1 ? "登录" : "未登录"));
        chain.doFilter(u,chain);
    }
}

定义长度过滤器实现类

public class LengthFilter implements Filter{
    @Override
    public void doFilter(User u, FilterChain chain) {
        if (u.getName().length() > 20)  System.out.println("Filter2" + "长度大于20");
        else  System.out.println("Filter2" + "长度不大于20");
        chain.doFilter(u,chain);
    }
}

定义过滤器责任链

public class FilterChain implements Filter{

    int index = 0;
    List<Filter> filterList = new ArrayList<>();

    public FilterChain add(Filter filter){
        filterList.add(filter);
        return this;
    }

    @Override
    public void doFilter(User user, FilterChain chain) {
        if (index == filterList.size()){
            return;
        }
        Filter filter = filterList.get(index);
        index++;
        filter.doFilter(user,chain);

    }
}

测试

public static void main(String[] args) {

        FilterChain chain = new FilterChain();
        chain.add(new LoginFilter()).add(new LengthFilter());

        User user = new User();
        user.setName("这是一个测试责任链模式程序");
        user.setState(1);
        chain.doFilter(user,chain);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值