1. 程式人生 > 實用技巧 >職責鏈模式

職責鏈模式

定義:

  使多個物件都有機會處理請求,從而避免請求的傳送者和接收者之間的耦合關係。將這些物件連成一條鏈,並沿著這條鏈傳遞該請求,直到有一個物件處理它為止。

  是一種遞迴操作,要注意所有接收者都無法處理請求的情況。

結構圖:

程式碼

//Handler類,定義一個處理請求的介面

classHandler
{

provite:

  Handler* pHandler;
public:

  //設定繼任者
  static SetNext(Handler* pHandler)
  {

    this.pHandler =pHandler;

  }

  //宣告處理請求的方法

  static HandlePequest(int irequest) = 0;

}

//ConcreteHandler類,具體處理者,如果能處理則處理,如果不能則轉發給後繼者

classConcreteHandlerA : Handler
{

public:

  //具體處理請求的方法

  static HandlePequest(int irequest)

  {

    if(0 < irequest <10)

    {

      。。。;//處理請求

    }

    elseif (pHandler!= NULL )

    {

      pHandler.HandlePequest(irequest);//下一繼任者處理

    }

  }

}

classConcreteHandlerB :Handler


{

public:

  //具體處理請求的方法

  static HandlePequest(int irequest)

  {

    if(10 <irequest <20)

    {

      。。。;//處理請求

    }

    elseif (pHandler!= NULL )

    {

      pHandler.HandlePequest(irequest);//下一繼任者處理

    }

  }

}

//客戶端

Handler*A = newConcreteHandlerA();

Handler*B = newConcreteHandlerB();

A.SetNext(B);

int irequest = 15;

A.HandlePequest(irequest);

使用時機:

  如果有多個物件可以處理同一個請求,但是具體由哪個物件處理是由執行時刻動態決定的,這種物件就可以使用職責鏈模式,把處理請求的物件實現成職責物件,然後構造鏈,當請求在這個鏈中傳遞的時候,會根據執行狀態判斷。

優點:

1、可以簡化物件的互相連線,降低耦合度;

2、可以隨時隨地增加或修改請求結構,增加了給物件指派職責的靈活性;同時也可以隨時增加修改處理物件。

缺點:

1、產生很多細粒度的物件:因為功能處理都分散到了單獨的職責物件中,每個物件功能單一,要把整個流程處理完,需要很多的職責物件,會產生大量的細粒度職責物件。

2、不一定能處理:每個職責物件都只負責自己的部分,這樣就可以出現某個請求,即使把整個鏈走完,都沒有職責物件處理它。這就需要提供預設處理,並且注意構造鏈的有效性。