加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

责任链模式

发布时间:2020-12-14 03:45:07 所属栏目:大数据 来源:网络整理
导读:概要 最近在写代码的时候,遇到if else 特别多,还存在嵌套情况;这导致代码很长,看着很难受,一点面向对象的感觉都没了; 也使得代码耦合度非常高; 小编通过责任链模式来解决这问题; 责任链模式定义(Chain of Responsibility) 在 GOF 23 中是这么描述的

概要

最近在写代码的时候,遇到if else 特别多,还存在嵌套情况;这导致代码很长,看着很难受,一点面向对象的感觉都没了;

也使得代码耦合度非常高;

小编通过责任链模式来解决这问题;

责任链模式定义(Chain of Responsibility)

在 GOF 23 中是这么描述的

Avoid coupling the sender of a request to its receiver by giving more then one object a chance to handle the request. Chain the receiving objects and pass the request along the chain until an object handles it.

译:通过为多个对象提供处理请求的机会,避免将请求的发送者耦合到其接收者。 链接接收对象并沿链传递请求,直到对象处理它。(总结:为请求创建了一个接收者对象的链。)

?

在这种模式中,小编个人认为有点像Node对象,只是Node里面这里逻辑判断;即请求传递给一个Node,Node不满足处理请求的条件,那么它会把相同请求传递给下一个Node,以此类推递归下去;

具体例子

例子就以我在工作中遇到的问题来阐述吧;

场景描述

往区块链发送交易修改合约时,合约会抛出一个事件,并把合约名称返回;这时中间件负责同步区块链中的交易数据,并根据合约名称来处理不同的合约数据解析转换成合约业务数据;

基本输入:?合约名称(contractName)、消息队列(blockingQueue)、http请求对象(bcClient)

过程:?根据不同合约名称,处理不同合约业务逻辑

输出:?将结果推送到队列中

coding
// 未优化前
if(CONTRACT.RECORD.equals(contractName)){
    System.out.println("process contract record. 使用bcClient 发送RECORD请求,并将结果推到BlockingQueue");
}else if(CONTRACT.RECORD_NTSC.equals(contractName)){
    System.out.println("process contract record_ntsc. 使用bcClient 发送RECORD_NTSC请求,并将结果推到BlockingQueue");
}else if(CONTRACT.REGISTRY.equals(contractName)){
    System.out.println("process contract registry.使用bcClient 发送REGISTRY请求,并将结果推到BlockingQueue.");
}else if(CONTRACT.REGISTRY_NTSC.equals(contractName)){
    System.out.println("process contract registry_ntsc.使用bcClient 发送REGISTRY_NTSC请求,并将结果推到BlockingQueue.");
}else if(CONTRACT.ACCOUNT.equals(contractName)){
    System.out.println("process contract account. 使用bcClient 发送ACCOUNT请求,并将结果推到BlockingQueue");
}else {
    System.out.println("process contract default. 使用bcClient 发送default请求,并将结果推到BlockingQueue.");
}

刚刚毕业的同学或许会觉得这个,这样的代码很正常不过了,但是随着业务的发展if判断可能会越来越长,非常过程过;耦合程度很高; 然后我们再仔细分析代码发现,这种方式就跟链一样一个接一个;

责任链UML设计

?

?

coding
// 使用责任链模式优化后

public AbstractContract getChainOfContract(){
    
    AbstractContract recordContract = new RecordContract();
    AbstractContract recordNTSCContract = new RecordNTSCContract();
    AbstractContract registryContract = new RegistryContract();
    AbstractContract registryNTSCContract = new RegistryNTSCContract();
    AbstractContract accountContract = new AccountContract();
    AbstractContract decaultContract = new DefaultContract();
    
    recordContract.setNext(recordNTSCContract);
    recordNTSCContract.setNext(registryContract);
    registryContract.setNext(registryNTSCContract);
    registryNTSCContract.setNext(accountContract);
    accountContract.setNext(decaultContract);
    return accountContract;
}

public static void main(String[] args){
    String contractName = args[0];
    AbstractContract contract = getChainOfContract();
    contract.exectue(contractName);
}

这样一写是不是很清晰了;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读