java设计模式-责任链模式

一:定义

对一个请求有多个对象去处理,处理对象包含了对另一个对象的引用,串行去处理,相当于形成了一个处理链,这种设计模式属于行为模式。
实现方式可以通过链表或者数组实现。

二:优缺点

优点

1.请求的发送者和接受者解耦
客户只需要将请求发送到责任链上即可,无须关心请求的处理细节和请求的传递过程,请求会自动进行传递
2.可以控制执行顺序
3.符合开闭原则和单一职责原则
单一原则:就是一个类只负责一项职责
开闭原则:对扩展是开放的,而对修改是封闭的,这样避免修改代码带来的风险

缺点

1.串行化执行处理,系统性能会受一定影响。
2.代码有可能循环调用,调试有一定的不便,即子类都调用父类的方法。

三:代码

代码实现

我们公司是做交易人员名称匹配的,将业务场景简化后,大致逻辑是交易人员请求信息过来后,要经过关键字检索、白名单检索、黑名单检索,如果命中人员信息匹配库的话,将返回,代码实现如下:
1.人员信息封装类,request
2.抽象处理类:Handler 。
3.具体处理类,继承Handler:CheckBlackListHandler(黑名单处理类) 、CheckKeyListHandler(关键字处理类) 、CheckWhiteListHandler (白名单处理类)。
4.客户类(Client)角色:ChainOfResponsibilityPattern(创建处理链,并将请求发送给处理链的第一个对象处理)

package com.dongya.chainofresponsibility;

/**
 * To do
 *
 * @author dongzhen
 * @date 2021/7/3 22:00
 */
public class ChainOfResponsibilityPattern {
    public static void main(String[] args) {
        CheckBlackListHandler checkBlackListHandler = new CheckBlackListHandler();
        CheckKeyListHandler checkKeyListHandler = new CheckKeyListHandler();
        CheckWhiteListHandler checkWhiteListHandler = new CheckWhiteListHandler();
        Request request = new Request();
        checkKeyListHandler.setNext(checkWhiteListHandler);
        checkWhiteListHandler.setNext(checkBlackListHandler);
        checkKeyListHandler.checkRule(request);


    }
}

/**
 * 请求类
 *
 * @author dongzhen
 * @date 2021/7/3 22:00
 */
class Request {
    public boolean hitKeyFlag;
    public boolean hitWhiteFlag;
    public boolean hitBlackFlag;

}

/**
 * 请求处理类
 *
 * @author dongzhen
 * @date 2021/7/3 22:00
 */
abstract class Handler {
    public static final boolean HIT_TRUE = true;
    public static final boolean HIT_FALSE = false;

    protected Handler next;

    public Handler getNext() {
        return next;
    }

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

    public void checkRule(Request request) {

    }
}

/**
 * 校验黑名单处理类
 *
 * @author dongzhen
 * @date 2021/7/3 22:00
 */
class CheckBlackListHandler extends Handler {
    @Override
    public void checkRule(Request request) {
        System.out.println("check black begin!");
        if (HIT_TRUE == request.hitBlackFlag) {
            System.out.println("hit black!");
            return;
        } else if (next != null) {
            System.out.println("not hit black,check next rule");
            next.checkRule(request);
        } else {
            System.out.println("this is the last one,no rule to check");
        }
    }
}

/**
 * 校验关键字处理类
 *
 * @author dongzhen
 * @date 2021/7/3 22:00
 */
class CheckKeyListHandler extends Handler {
    @Override
    public void checkRule(Request request) {
        System.out.println("check key begin!");
        if (HIT_TRUE == request.hitKeyFlag) {
            System.out.println("hit key!");
            return;
        } else if (next != null) {
            System.out.println("not hit key,check next rule");
            next.checkRule(request);
        } else {
            System.out.println("this is the last one,no rule to check");
        }
    }
}

/**
 * 校验白名单处理类
 *
 * @author dongzhen
 * @date 2021/7/3 22:00
 */
class CheckWhiteListHandler extends Handler {
    @Override
    public void checkRule(Request request) {
        System.out.println("check white begin!");
        if (HIT_TRUE == request.hitWhiteFlag) {
            System.out.println("hit white!");
            return;
        } else if (next != null) {
            System.out.println("not hit white,check next rule");
            next.checkRule(request);
        } else {
            System.out.println("this is the last one,no rule to check");
        }
    }
}


执行结果

check key begin!
not hit key,check next rule
check white begin!
not hit white,check next rule
check black begin!
this is the last one,no rule to check

其它实现

还有 Struts2 的拦截器、JSP 和 Servlet 的 Filter 等

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值