责任链模式

注:第一节 部分引自:http://www.cnblogs.com/kym/archive/2009/04/06/1430078.html


一、责任链模式(Chain of Responsiblity)
    定义:  使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止。
       结构实图:
责任链模式涉及角色如下:
  • 待处理(Client)角色:一个需要处理的请求,可以是消息或者其他
  • 抽象处理者(Handler)角色:定义一个对外处理请求的接口。由它将请求分发到具体处理者( ConcreteHandler)角色进行逐次请求处理。抽象处理者(Handler)角色和具体处理者(ConcreteHandler)角色是聚合关系
  • 具体处理者(ConcreteHandler)角色:具体处理者接受到请求时,对其感兴趣的消息处理,或者传递给下个具体处理者处理
二、简单责任链模式的实现
接口定义:
public interface Filter {
     
     public void messageReceived(String msgType,List<String> contents,NextFliter nextFliter);
     
     public static interface NextFliter{
           
            void doFilter(String msgType,List<String> contents);
           
     }
     
     public static interface FilterChain{
            public void addFirst(Filter filter);
            public void addLast(Filter filter);
            public void messageReceived(String msgType, List<String> contents);
     }

}



接口详细说明:
  • Filter接口:对应责任链模式中的就是具体处理者(ConcreteHandler)角色,只有一个方法messageReceived(String msgType,List<String> contents,NextFliter nextFliter)。其中msgType和contents就是需要处理的请求消息,对应责任链中的待处理(Client)角色。nextFliter是调用下一个具体处理(ConcreteHandler)角色,这样做的好处就是Filter不必只有下一个Filter的引用。具体如何实现见下面的FilterChain的实现
  • FilterChain接口:对应责任链模式中的抽象处理(Handler)者角色。该接口持有所有的Filter,addFirst(Filter filter)和addLast(Filter filter)方法就是向FilterChain中加入具体处理者(ConcreteHandler)角色。当请求消息到来时,FilterChain调用自身的messageReceived方法,将请求传给第一个Filter,Filter再通过自己的messageReceived方法对请求处理或者传递给下一个Filter
  • NextFliter接口:从字面意思即下一个Filter,但这个接口同样由FilterChain实现,此接口主要是通知FilterChain获取下一个Filter处理请求消息
FilterChain具体实现:
public class DefaultFilterChain implements Filter.NextFliter,Filter.FilterChain {
     private LinkedList<Filter> fliters = new LinkedList<Filter>();
     private int index = 0;
     
     public DefaultFilterChain(){}
     public void addLast(Filter fliter) {
            if (fliter == null)
                 return;
            fliters.addLast(fliter);
     }
     public void addFirst(Filter fliter) {
            if (fliter == null)
                 return;
            fliters.addFirst(fliter);
     }
     
     public  void messageReceived(String msgType, List<String> contents) {
            index = -1;
           doFilter(msgType, contents);
     }
     
     public void doFilter(String msgType, List<String> contents) {
            index++;
            if( index < fliters.size()){
                 fliters.get( index).messageReceived(msgType, contents, this);
           }
     }
}



FilterChain实现总结:
      优点
  1. Filters使用链表存储,实现简单。每个Filter不必引用下一个Filter,由FilterChain实现,这样Filter实现比较简单方便
  2. FilterChain同时实现NextFliter,每个Filter在调用下一个Filter时只需要调用nextFilter.doFilter(...)方法,这样做实现了接口隔离的效果
不足
  1. 内部使用index,造成线程不安全,如果对messageReceived方法同步代价太高,不合适
  2. 虽然FilterChain和NextFilter起到接口隔离效果,但两个接口同时由DefaultFilterChain实现,代码耦合度太高,不利于拓展
  3. 对请求消息不够抽象,造成功能单一
  4. 只能单向过滤处理消息,不能反向
优化空间
  1. 不使用LinkedList,自己实现单向链表或者双向链表
  2. 使用双向链表实现双向过滤处理,既可以处理messageReceived消息,又可以处理messageSent消息
  3. FilterChain和NextFilter分开实现,降低耦合度
有机会介绍下在Mina中责任链是如何实现的...
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值