职责链模式里面必须要知道的事情

原创
2016/03/08 11:04
阅读数 67

                                                                     职责链模式里面必须要知道的事情

    用java web开发的很多同学很容易沉迷于各种框架的使用技巧,而忽略servlet的一些细节。对很多框架的设计模式很了解,却对servlet里面的设计模式知之不详。其实这个模式在servlet 2.3 的时候就已经在使用了,它就是filter chains的设计思想。

    带着两个问题去学习,一个是为责任链模式模式链字体现在哪里?责任是怎么传递的? 

    责任链模式的UML图:

                                        

    有一种向下递归的感觉,看了这个UML的感觉。

    看代码的具体实现:

    

    public abstract class Support {
	
	private String name;
	
	private Support next;
	
	public Support(String name){
		this.name=name;
	}
	//这个地方有点反平时的一个思维
	public Support setNext(Support next){
		this.next=next;
		return next;
	}
	//这里就有责任转送的思想,加模版方法
	public final void support(Trouble trouble){
	        if(resolve(trouble)){
		    done(trouble);
		}
		else if(next!=null){
		    next.support(trouble);//传送责任
		}
		else {
		    fail(trouble);
		}
	}
	
	//关注子类实现
	protected abstract boolean resolve(Trouble trouble);
	
	protected void done(Trouble trouble){
		System.out.println(trouble+"is resolve by"+this);
	}
	
	protected void fail(Trouble trouble){
		System.out.println(trouble+"cant resolve by"+this);
	}
    }
    
    //第一链
    public class NoSupport extends Support{

	public NoSupport(String name) {
		super(name);
	
	}

	@Override
	protected boolean resolve(Trouble trouble) {
		// TODO 自动生成的方法存根
		return false;
	}

    }
    //第二链
    public class LimitSupport extends Support {

	private int limit;
	public LimitSupport(String name,int limit) {
		super(name);
		this.limit=limit;
		// TODO 自动生成的构造函数存根
	}

	@Override
	protected boolean resolve(Trouble trouble) {
		// TODO 自动生成的方法存根
		
		if(trouble.getNumber()<limit){
			return true;
		}
		return false;
	}

    }
    
    //如何使用责任链, 就像一个链表一样,所有相关职责串联在一起,成功的就不在传送,失败的就接着传送
    public class TestMain {
	public static void main(String args[]) {
		Support alice = new NoSupport("alice");
		Support bob = new LimitSupport("bob", 100);

		alice.setNext(bob);

		alice.support(new Trouble(10));
		alice.support(new Trouble(102));

	}
}

    

    这个模式最中重要的思想就是,我这个链上我只关注我能不能处理这个问题,不能就转给其他人,而不是我要知道问题是怎么处理。还有一点弊端,就是中间一个环节太慢,会拖慢整个处理链的速度。就像连环船一样,有利有弊,要在恰当的地方处理而已。


展开阅读全文
打赏
1
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
1
分享
返回顶部
顶部