定义

使多个对象都由机会处理请求,从而避免了请求的发送者喝接受者之间的耦合。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理它为止。

使用場景

當某人申請一定的費用進行活動的時候,根據不同的金額需要通過項目經理,部門經理,總經理的審批。

代碼實例

(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);

    }

}

運行結果:
總經理通過了小李的請求
除小李之外都不可以