定义
使多个对象都由机会处理请求,从而避免了请求的发送者喝接受者之间的耦合。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。
使用場景
當某人申請一定的費用進行活動的時候,根據不同的金額需要通過項目經理,部門經理,總經理的審批。
代碼實例
(1)定義職責的抽象類
package design;
public abstract class Handle {
//持有下一個處理請求的對象
protected Handle sussor = null;
//這裏使用setter方法,不能使用構造器方法
public void setHandle(Handle h)
{
this.sussor = h;//這裏將h寫成了sussor,報空指針異常
}
public abstract void handleRequest(String user,int money);
}
(2)項目經理的處理
package design;
public class ProjectHandle extends Handle {
public void handleRequest(String user,int money)
{
if (money < 500)
{
if (user.equals("小李"))
{
System.out.println("通過申請");
}
else
{
System.out.println("除小李之外都不可以");
}
}
else
{
if (sussor != null)
this.sussor.handleRequest(user,money);
else
System.out.println("sussor為空");
}
}
}
(3)部門經理的處理
package design;
public class DepHandle extends Handle{
@Override
public void handleRequest(String user, int money) {
// TODO Auto-generated method stub
if (money < 1000)
{
if (user.equals("小李"))
{
System.out.println("部門經理通過了小李的申請");
}
else
System.out.println("部門經理沒批准"+user+"的申請");
}
else{
this.sussor.handleRequest(user, money);
}
}
}
(4)縂經理的處理
package design;
public class GeneralHandle extends Handle{
@Override
public void handleRequest(String user, int money) {
// TODO Auto-generated method stub
if (user.equals("小李"))
{
System.out.println("總經理通過了小李的請求");
}
else
{
System.out.println("縂經理沒有通過"+user+"的申請");
}
}
}
(5)客戶端
package design;
public class Client {
public static void main(String[] args)
{//組裝職責鏈
Handle h1 = new ProjectHandle();
Handle h2 = new DepHandle();
Handle h3 = new GeneralHandle();
h1.setHandle(h2);
h2.setHandle(h3);
h1.handleRequest("小李", 2000);
h1.handleRequest("Burning",100);
}
}
運行結果:
總經理通過了小李的請求
除小李之外都不可以