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: 后续会进行补充