转载请注明出处:http://blog.csdn.net/droyon/article/details/8708753
定义:创建一个对象链,每个对象对请求依次检查,并对其处理,或者将它传给链中的下一个对象。
应用;经常用在窗口系统中,处理点击事件等,如果点击事件在某个窗口对象上消耗了,那么此点击事件不再继续往下传送。
责任链模式关键在于运用某种关系是对象之间形成链,这个关系可以是继承,也可以是组合。
代码下载案例:
在公司制度中,部门经理有权处理请假日期小于等于三天的事务,如果请假日期多余三天,那么需要老总批准。
Responsibility.java
public abstract class Responsibility {
private Responsibility mSuccessor;
public Responsibility getmSuccessor() {
return mSuccessor;
}
public void setmSuccessor(Responsibility mSuccessor) {
this.mSuccessor = mSuccessor;
}
abstract void handle(int holiday);
}
Manager.java
public class Manager extends Responsibility{
public Manager(){
System.out.println("部门经理,请假三天以内,我可以批准");
}
@Override
void handle(int holiday) {
if(holiday>3){
System.out.println("交由老总来批准");
Responsibility responsibility = getmSuccessor();
if(responsibility !=null){
responsibility.handle(holiday);
}
}else{
System.out.println("批准了");
}
}
}
Boss.java
public class Boss extends Responsibility{
public Boss(){
System.out.println("我是老总,请假超过3天需要我批准");
}
@Override
void handle(int holiday) {
if(holiday >3){
System.out.println("批准了");
}
}
}
Test.java
/**
* 请假三天以内,部门经理可以批准,三天以上需要报请老总批准
* @author
*
*/
public class Test {
public static void main(String args[]){
Manager manager = new Manager();
Boss boss = new Boss();
manager.setmSuccessor(boss);
System.out.println("----------------------------------");
int holiday = 4;
System.out.println("我要请假,请假天数:"+holiday);
manager.handle(holiday);
}
}
运行结果:
部门经理,请假三天以内,我可以批准
我是老总,请假超过3天需要我批准
----------------------------------
我要请假,请假天数:4
交由老总来批准
批准了
总结:责任链模式的优点,可以简化对象,因为它不需要知道链的结构。责任链模式让请求的发送者与接受者解耦。通过改变链内的成员或调用他们的次序,允许你动态的新增或者删除责任。
关于责任链模式的更多介绍http://guafei.iteye.com/blog/913388