将一些对象串联成一条“链”,然后沿着这条“链”来传递请求,直到请求被执行或都“链”已传递到尽头才会返回值,这就是职责链模式了。
举一个例子:将 项目经理、总经理、老板组成一条“链”,然后项目人员要请求活动经费时向这条“链”发出请求,如果申请经费金额小于1000元,项目经理可以批,若金额大于1000小于5000,那就要总经理批准,大于5000就只有老板才有权批准了。下面给出这个例子的代码。
abstract class Handle
{
protected Handle handle;
protected String message = "";
public void setHandle(Handle handle)
{
this.handle = handle;
}
/**
* 请求活动经费
*
* @param name
* 请求者
* @param fee
* 请求金额
* @return
*/
public abstract String requestFee(String name, int fee);
}
/**
* 项目经理,能批1000以下的活动经费
*
* @author Administrator
*
*/
class ProjectManager extends Handle
{
@Override
public String requestFee(String name, int fee)
{
if (fee <= 1000)
{
if (name.equals("李明"))
{
this.message = "项目经理批准了李明申请的活动经费,金额为:" + fee;
} else
{
this.message = "项目经理不批准" + name + "的申请";
}
return this.message;
} else
{
if (this.handle != null)
{
return this.handle.requestFee(name, fee);
}
}
return this.message;
}
}
/**
* 总经理,能批5000以下的活动经费
*
* @author Administrator
*
*/
class GeneralManager extends Handle
{
@Override
public String requestFee(String name, int fee)
{
if (fee <= 5000)
{
if (name.equals("李明"))
{
this.message = "总经理批准了李明申请的活动经费,金额为:" + fee;
} else
{
this.message = "总经理不批准" + name + "的申请";
}
return this.message;
} else
{
if (this.handle != null)
{
return this.handle.requestFee(name, fee);
}
}
return this.message;
}
}
/**
* 老板,能批所有数额的活动经费
*
* @author Administrator
*
*/
class Boss extends Handle
{
@Override
public String requestFee(String name, int fee)
{
if (name.equals("李明"))
{
this.message = "老板批准了李明申请的活动经费,金额为:" + fee;
} else
{
this.message = "老板不批准" + name + "的申请";
}
return this.message;
}
}
/**
* 测试类
*
* @author Administrator
*
*/
public class Test
{
public static void main(String[] args)
{
Handle projectManager = new ProjectManager();
Handle generalManager = new GeneralManager();
Handle boss = new Boss();
//组成职责链
projectManager.setHandle(generalManager);
generalManager.setHandle(boss);
//李明申请活动经费
System.out.println(projectManager.requestFee("李明", 800));
System.out.println(projectManager.requestFee("李明", 1500));
System.out.println(projectManager.requestFee("李明", 8000));
//王小明申请活动经费
System.out.println(projectManager.requestFee("王小明", 800));
System.out.println(projectManager.requestFee("王小明", 1500));
System.out.println(projectManager.requestFee("王小明", 8000));
}
}
屏幕打印结果如下:
项目经理批准了李明申请的活动经费,金额为:800
总经理批准了李明申请的活动经费,金额为:1500
老板批准了李明申请的活动经费,金额为:8000
项目经理不批准王小明的申请
总经理不批准王小明的申请
老板不批准王小明的申请