AnthonyZero's Bolg

设计模式:责任链模式

前言

通过Netty的ChannelPieline 了解到了责任链模式,通过控制行为分类责任链模式有两种形式,一种是通过外部调用的方式对链的各个节点调用进行控制,从而进行链的各个节点之间的切换;另一种是链的每个节点自由控制是否继续往下传递链的进度,这种比较典型的使用方式在Netty中有所体现。

通俗而言:责任链模式是一条链,链上有多个节点,每个节点都有各自的责任。当有输入时,第一个责任节点看自己能否处理该输入,如果可以就处理。如果不能就交由下一个责任节点处理。依次类推,直到最后一个责任节点。

典型应用例子除了Netty 的ChannelPieline、ChannelHandler之外,还有Web的Servlet 和 Filter以声明的方式插入到Http请求响应的处理过程,用于拦截请求和响应

具体角色

抽象处理者角色(Handler): 定义出一个处理请求的接口。如果需要的话,接口可以定义出一个方法以设定和返回对下家的引用。这个角色通常由一个Java抽象类或者Java接口实现。
具体处理者角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。
客户端:事件的发起者(发起者可以由第一个处理者发起进行事件传递或者外部调用的方式组织链条形式依次调用处理者角色来传递事件

实现举例(组织链)

以对字符串进行简单过滤处理为例:

  • 定义一个接口,包含一个处理方法

    1
    2
    3
    4
    public interface Process {   
    //执行处理   
    String doProcess(String word);
    }
  • 不同的处理器,实现接口重写方法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class FaceProcess implements Process {    
    @Override   
    public String doProcess(String word) {       
    return word.replace(":)", "^V^");   
    }
    }
    public class SesitiveProcess implements Process {    @Override   
    public String doProcess(String word) {       
    return word.replace("敏感", "和谐");   
    }
    }

以及其他具体的process

  • 然后给客户端提供一个执行入口以及添加责任链的入口即可:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    public class ProcessChain implements Process {    
    private List<Process> chains = new ArrayList<>() ;   
    // 添加责任处理人  
    public ProcessChain addChain(Process process){
    chains.add(process) ;       
    return this ;   
    }   
    @Override   
    public String doProcess(String word) {       
    String result = word;       
    for(Process process: chains){           
    result = process.doProcess(result);       
    }       
    return result;   
    }
    }
  • 测试

    1
    2
    3
    4
    5
    6
    7
    public static void main(String[] args) {    
    String word = ":)敏感内容==" ;   
    ProcessChain chain = new ProcessChain()           
    .addChain(new FaceProcess())           
    .addChain(new SesitiveProcess());   
    System.out.println(chain.doProcess(word));
    }
  • 输出: ^V^和谐内容==

当我需要再增加一个处理逻辑时只需要添加一个处理单元即可(addChain(Process process)),并对客户端 chain.process(word) 是无感知的,不需要做任何的改动。

总结

责任链模式是一种行为型设计模式,所谓责任,就是一个Handler做某一种处理。各个Handler之间低耦合,易于扩展。所谓链,就是各个Handler依次对请求做相应处理的一种组织形式。请求者与处理者是解耦的。请求者只需要发出请求,链条中的各个具体处理者负责处理自己的那部分。简言之就是:分离职责,动态组合。