7 - 责任链模式-行为模式


参考:设计模式之禅

1. 定义

多个对象连成一个链,沿着链传递请求,直到有对象处理为止。
在这里插入图片描述

public abstract class AbstractLogger {
    protected static int DEBUG = 1;
    protected static int INFO = 2;
    protected static int ERROR = 3;
    protected int level = 0;
    protected AbstractLogger logger;

    public AbstractLogger(int level) {
        this.level = level;
    }


    public void handleRequest(int level, String msg) {
        if (this.level <= level) {
            write(msg);
        } else {
            if (this.logger != null) {
                this.logger.handleRequest(level, msg);
            }
        }
    }

    public abstract void write(String msg);

    public void setLogger(AbstractLogger logger) {
        this.logger = logger;
    }
}
public class DebugLogger extends AbstractLogger {
    public DebugLogger() {
        super(AbstractLogger.DEBUG);
    }

    @Override
    public void write(String msg) {
        System.out.println("Level =" + level + ",debug msg = " + msg);
    }
}
public class InfoLogger extends AbstractLogger {
    public InfoLogger() {
        super(AbstractLogger.INFO);
    }

    @Override
    public void write(String msg) {
        System.out.println("Level =" + level + ",info msg = " + msg);
    }
}
public class ErrorLogger extends AbstractLogger {
    public ErrorLogger() {
        super(AbstractLogger.ERROR);
    }

    @Override
    public void write(String msg) {
        System.out.println("Level =" + level + ",error msg = " + msg);
    }
}

public class Client {
    public static void main(String[] args) {
        ErrorLogger errorLogger = new ErrorLogger();
        InfoLogger infoLogger = new InfoLogger();
        DebugLogger debugLogger = new DebugLogger();
        errorLogger.setLogger(infoLogger);
        infoLogger.setLogger(debugLogger);

        errorLogger.handleRequest(1,"critical thinking");

    }
}

2. 应用

2.1 优点

将请求和处理分开,解耦,提高系统灵活性。

2.2 缺点

  • 性能问题,因为请求要从头到尾遍历一遍;
  • 调试麻烦。

可以设置责任链的节点数量。

3. 模拟web请求

/**
 * 模拟web请求request和response的处理
 * <p>
 * 有若干个Filter,request先经过第一个Filter处理,然后是第二个,直到最后一个;然后response返回则返过来,先经过最后一个Filter,
 * 然后倒数第二个,以此类推。
 * </P>
 *
 * @author tobebetter9527
 * @create 2021/07/25 14:40
 */
public class FilterChainDemo {

  public static void main(String[] args) {
    Request request = new Request();
    Response response = new Response();
    request.req = "你好,<script>, 我们都是996";
    response.res = "返回顺序:";

    FilterChain chain = new FilterChain();
    chain.add(new WordFilter()).add(new HtmlFilter());
    chain.doFilter(request, response);
    System.out.println("===============");
    System.out.println(request.req);
    System.out.println(response.res);
  }
}

interface Filter {

  void doFilter(Request request, Response response, FilterChain chain);
}

class HtmlFilter implements Filter {

  @Override
  public void doFilter(Request request, Response response, FilterChain chain) {
    request.req = request.req.replaceAll("<", "[").replaceAll(">", "]");
    System.out.println("HtmlFilter:" + request.req);
    chain.doFilter(request, response);
    response.res = response.res + "--HtmlFilter";
  }
}

class WordFilter implements Filter {

  @Override
  public void doFilter(Request request, Response response, FilterChain chain) {
    request.req = request.req.replaceAll("996", "955");
    System.out.println("WordFilter:" + request.req);
    chain.doFilter(request, response);
    response.res = response.res + "--WordFilter";
  }
}

class FilterChain {

  private List<Filter> filters = new ArrayList<>();
  private int index;

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

  public void doFilter(Request request, Response response) {
    if (index == filters.size()) {
      return;
    }
    Filter filter = filters.get(index);
    index++;
    filter.doFilter(request, response, this);
  }
}


class Request {

  String req;
}

class Response {

  String res;
}



4. 参考资料

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值