1.問題

現在有一個命令需要層級審批,比如請假,

如果小於等於3天,那麼只需要主管審批通過,

如果大於3天小於等於7天,則通過後又需要總監審批通過,

如果大於7天,通過後又需要總經理審批通過。

這樣的業務流程如何實現呢?其實這就是一個典型的責任鏈模式的應用場景。

 

2.定義

命令的請求要經過多層判斷,為了避免客户端和處理程序的耦合作用,將處理程序進行抽象,每個對象持有下一個處理對象的引用,就像是鏈表一樣,一級一級的處理,這樣的設計方式就叫做責任鏈模式。

 

3.代碼

public abstract class Response
{
    protected Response NextResponse;

    public abstract void Handle(int dayNum);
}

public class Director : Response
{
    public Director()
    {
        NextResponse = new Chief();
    }

    public override void Handle(int dayNum)
    {
        Console.WriteLine("主管審批同意");
        if (dayNum > 3)
        {
            NextResponse.Handle(dayNum);
        }
    }
}

public class Chief : Response
{
    public Chief()
    {
        NextResponse = new TopManager();
    }

    public override void Handle(int dayNum)
    {
        Console.WriteLine("總監審批同意");
        if (dayNum > 7)
        {
            NextResponse.Handle(dayNum);
        }
    }
}

public class TopManager : Response
{
    public override void Handle(int dayNum)
    {
        Console.WriteLine("總經理審批同意");
    }
}

調用的時候只需要

Response direct = new Director();
direct.Handle(5);
Console.ReadLine();

 

4.特點

如果沒有責任鏈的話,上面這個代碼個人會怎麼寫呢,應該就是if+else不停地判斷吧;

這樣雖然沒有什麼錯誤,但是一旦判斷增加,就不得不修改if語句,而且如果if中的業務邏輯很多的話,也很難維護

因此,責任鏈模式經常被用來重構if語句。

優點:將多個判斷邏輯分別封裝到了不同的類中,使代碼的層次更明確

缺點:當判斷比較多時,會有很多處理類,而且還有性能問題