設計模式--責任鏈模式C++實現


責任鏈模式C++實現

1定義

使多個對象都有機會處理請求,從而避免了請求的發送者和接受者之間的耦合關系。將這些對象鏈成一條鏈,並沿着這條鏈傳遞該請求/命令,直到有對象處理它為止

注:這里的請求、命令正是可以和命令模式進行結合的地方

2類圖

class Handler

{

private:

  Handler* nextHandler;

protected:

  Handler();

pubic:

  virtual~Handler()=0;

  //每個處理者都必須對請求作出處理,如果是自己能處理的,自己處理,並且返回結果。否則,傳遞給下一個處理者

  Response handleMessage(Request *request)

  {

    Response *res = NULL;

    //如果請求級別和處理者級別相同/有能力處理,那么處理

    if(getHandlerLevel() == request.getRequestLevel())

    {

      res = echo(request);

    }

    else

    {

      if(nextHandler!= NULL)

      {

        res = nextHandler.handleMessage(request);

      }

      else

      {

        //沒有適當的處理者,業務自行處理

      }

    }

  }

  void setNext(Handler hand)

  {

    nextHandler = hand;

  }

protected:

  virtual Level getHandlerLevel()=0;

  //每個處理者都必須實現處理任務

  Response echo(Request res);

};

注:抽象處理者的三個職責:①定義請求處理方案,唯一對外開放;②定義一個鏈的編排方法setNext;③定義具體處理者的兩個方法(權限獲取和處理)

class ConcreteHandler:public Handler

{

public:

  ConcreteHandler();

  ~ConcreteHandler();

protected:

  Response echo()

  {

    //完成邏輯

    return NULL;

  }

  Level getHandlerLevel()

  {

    //設置自己的處理級別

    return;

  }

};

//等級設置。可以在內部詳細處理優先級設置問題

class Level{};

//請求封裝

class Request

{

public:

  Level getRequestLevel()

  {

    return NULL;

  }

};

//處理者返回的數據

class Response

{};

4提升性

①在實際中對於責任鏈的設置多半是固定的,所以可以將之封裝從而實現客戶端的最少知道(迪米特原則)

②在責任鏈中設置最大結點數

5應用

①優點

將請求和處理分開,達到解耦,迪米特。

②缺點

鏈長度過長時就會有效率問題,其次是調試問題(這個問題也類似於遞歸)

6 總結

責任鏈可以作為一種補救措施.--中介者模式---模板方法模式


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM