责任链设计模式

what’s up man

- java设计模式☞☞☞☞☞责任链设计模式


个人理解: java多态+递归调用


  • 接口 Filter
  • 主要的调用类 FilterChain
  • 具体的实现类 Aa
  • 具体的实现类 Bb
  • 被处理对象 FilterInfo filterInfo
  • 本例参考struts的拦截器,对于对象FilterInfo filterInfo做处理

快捷键

/**
一个被责任链多次处理的对象FilterInfo filterInfo
*/
public Class FilterInfo{
    private String aa = "aa";
    private String bb = "bb";

    public void setAa(String aa){
        this.aa = aa;
    }
    public String getAa(){
        return aa;
    }
    public void setBb(String bb){
        this.bb = bb;
    }
    public String getBb(){
        return bb;
    }
}
/**
定义接口,在递归调用时,会通过父类引用指向子类对象这种方式调用子类的doFilter方法
HttpServletRequest request: 这个参数是楼主实现业务的时候需要用到的
ChainFilter chainFilter: 这个就是递归的主体类
FilterInfo filterInfo: 被处理的类
*/
public Interface Filter{
    FilterInfo doFilter(HttpServletRequest request, ChainFilter chainFilter, FilterInfo filterInfo)
}
/**
定义链式调用
*/
public Class ChainFilter implements Filter{
    private index = 0;
    public List<Filter> filters= new ArrayList<Filter>();//实现类AaFilter,BbFilter都需要放入此list中
    public ChainFilter addFilter(Filter){
        filters.add(Filter);
        return this;//list在链式调用的时候存入多个实现类
    }
@Override
FilterInfo doFilter(HttpServletRequest request, ChainFilter chainFilter, FilterInfo filterInfo){
    if(index == filters.size()){//递归调用必须要有出口
        return filterInfo;//最终返回的是被处理过的filterInfo对象
    }
    Filter filter = filters.get(index);//获取当前要执行doFilter方法的实现类
    index++;
return filter.doFilter(request, chainFilter, filterInfo);//递归调用(父类引用指向子类对象,调用父类引用被重写的方法时就会有多态存在,此处楼主理解了为什么要实现一个共同的接口,同时也是java多态的一个应用)
}
}    
/**
实现类AaFilter,具体处理FilterInfo filterInfo的方法一
*/
public Class AaFilter implements Filter{
@Override
public doFilter(HttpServletRequest request, ChainFilter chainFilter, FilterInfo filterInfo){
    filterInfo.setAa("AAA");//改变Aa这个字段
    return chainFilter.doFilter(request, chainFilter, filterInfo);//递归调用
}
}
/**
实现类BbFilter,具体处理FilterInfo filterInfo的方法二
*/
public Class BbFilter implements Filter{
    @Override
    public FilterInfo doFilter(HttpServletRequest request, ChainFilter chainFilter, FilterInfo filterInfo){
        filterInfo.setBb("BBB");//改变bb的值
        return chainFilter.doFilter(request, chainFilter, filterInfo);//递归调用
    }

}
/**
程序入口
*/
public Class Test{  
    public static void main(String[] args){ 
        HttpServletRequest request = ServletActionContext.getRequest();//获取struts中HttpServletRequest 的一种方式,在本例中,并未对该对象进行处理,楼主是因为业务需要,所以要传入此对象(单从设计模式而言,是不需要的)
        ChainFilter chainFilter = new ChainFilter();
        chainFilter.add(new AaFilter()).add(new BbFilter());//链式调用

        FilterInfo filterInfo = new FilterInfo();//被处理的对象
        chain.doFilter(request, chainFilter, filterInfo);//理解责任链的关键就是这个被覆写的方法

        System.out.println("aa变成了: "+filterInfo.getAa()+", bb变成了: "+filterInfo.getBb());
    }  
}  

补充说明

1: 这是我个人对责任链设计模式的分析理解,如有纰漏或者错误,敬请提出指正
2: 后续会进行补充

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值