欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++設(shè)計(jì)模式之職責(zé)鏈模式

 更新時(shí)間:2014年10月08日 10:47:40   投稿:junjie  
這篇文章主要介紹了C++設(shè)計(jì)模式之職責(zé)鏈模式,本文講解了什么是職責(zé)鏈模式、什么場合下使用、代碼實(shí)例等內(nèi)容,需要的朋友可以參考下

前言

最近心情很差,因?yàn)樯?,因?yàn)楣ぷ?;所以想?qǐng)幾天假去麗江玩玩。就向項(xiàng)目經(jīng)理提交了休假申請(qǐng),我的項(xiàng)目經(jīng)理向項(xiàng)目主管提交了我的休假申請(qǐng),項(xiàng)目主管向部門經(jīng)理提交了我的休假申請(qǐng);最后,部門經(jīng)理同意了我的休假申請(qǐng)。是的,一個(gè)簡單的休假申請(qǐng),需要這么復(fù)雜的流程,這也是一個(gè)公司保證它正常運(yùn)行的必要。如果部門經(jīng)理休假了,那么我的休假申請(qǐng)由誰審批呢?這個(gè)時(shí)候由項(xiàng)目主管代替部門經(jīng)理進(jìn)行審批。一個(gè)休假申請(qǐng)的審批制度有著嚴(yán)格的要求。而在處理這個(gè)請(qǐng)假審批時(shí),各個(gè)人員就好比在一條鏈上的節(jié)點(diǎn),我不知道我的請(qǐng)求由誰審批,但是,我的請(qǐng)求最終會(huì)有人來處理的。而這樣的一種行為,就好比我今天需要總結(jié)的職責(zé)鏈模式一樣。

什么是職責(zé)鏈模式?

在GOF的《設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)》一書中對(duì)職責(zé)鏈模式是這樣說的:使多個(gè)對(duì)象都有機(jī)會(huì)處理請(qǐng)求,從而避免請(qǐng)求的發(fā)送者和接收者之間的耦合關(guān)系。將這些對(duì)象連成一條鏈,直到有一個(gè)對(duì)象處理它為止;如下圖:

對(duì)于每個(gè)角色,他們都有他們的職責(zé);當(dāng)我提交了休假申請(qǐng)時(shí),項(xiàng)目經(jīng)理需要判斷,看看自己能否處理,如果休假超過了2個(gè)小時(shí),那么項(xiàng)目經(jīng)理就不能處理了;項(xiàng)目經(jīng)理將這個(gè)請(qǐng)求提交到項(xiàng)目主管,項(xiàng)目主管判斷部門經(jīng)理在不在,如果部門經(jīng)理在,項(xiàng)目主管就不能處理了;最后,我的休假申請(qǐng)就到了部門經(jīng)理那里了,由他親自審批??梢院苊黠@的看到,項(xiàng)目經(jīng)理、項(xiàng)目主管和部門經(jīng)理都有可能處理我的休假申請(qǐng),我的請(qǐng)求沿著這條鏈一直走下去,直到有人處理了我的請(qǐng)求。

UML類圖

Handler:定義了一個(gè)處理請(qǐng)求的接口;其它類如果需要處理相同的請(qǐng)求,可以實(shí)現(xiàn)該接口就好了;
ConcreteHandler:處理它所負(fù)責(zé)的請(qǐng)求,如果可處理該請(qǐng)求,就處理掉這個(gè)請(qǐng)求;否則將該請(qǐng)求轉(zhuǎn)發(fā)給它的下一個(gè)可以處理該請(qǐng)求的對(duì)象,所以它必須能訪問它的下一個(gè)可以處理同樣請(qǐng)求的對(duì)象;
Client:向處理對(duì)象提出具體的請(qǐng)求。

當(dāng)客戶提交一個(gè)請(qǐng)求時(shí),請(qǐng)求沿著一條鏈傳遞,直至有一個(gè)ConcreteHandler對(duì)象負(fù)責(zé)處理它。

使用場合

1.有多個(gè)的對(duì)象可以處理一個(gè)請(qǐng)求,由哪個(gè)對(duì)象處理該請(qǐng)求是在運(yùn)行時(shí)刻自動(dòng)確定的;
2.如果想在不明確指定接收者的情況下,向多個(gè)對(duì)象中的一個(gè)提交一個(gè)請(qǐng)求;
3.可以處理一個(gè)請(qǐng)求的對(duì)象集合應(yīng)被動(dòng)態(tài)指定。

代碼實(shí)現(xiàn)

復(fù)制代碼 代碼如下:

#include <iostream>
using namespace std;
 
#define SAFE_DELETE(p) if (p) { delete p; p = NULL; }
 
class HolidayRequest
{
public:
     HolidayRequest(int hour) : m_iHour(hour){}
     int GetHour() { return m_iHour; }
private:
     int m_iHour;
};
 
// The holiday request handler interface
class Manager
{
public:
     virtual bool HandleRequest(HolidayRequest *pRequest) = 0;
};
 
// Project manager
class PM : public Manager
{
public:
     PM(Manager *handler) : m_pHandler(handler){}
     bool HandleRequest(HolidayRequest *pRequest)
     {
          if (pRequest->GetHour() <= 2 || m_pHandler == NULL)
          {
               cout<<"PM said:OK."<<endl;
               return true;
          }
          return m_pHandler->HandleRequest(pRequest);
     }
private:
     Manager *m_pHandler;
};
 
// Department manager
class DM : public Manager
{
public:
     DM(Manager *handler) : m_pHandler(handler){}
     bool HandleRequest(HolidayRequest *pRequest)
     {
          cout<<"DM said:OK."<<endl;
          return true;
     }
 
     // The department manager is in?
     bool IsIn()
     {
          return true;
     }
private:
     Manager *m_pHandler;
};
 
// Project supervisor
class PS : public Manager
{
public:
     PS(Manager *handler) : m_pHandler(handler){}
     bool HandleRequest(HolidayRequest *pRequest)
     {
          DM *pDM = dynamic_cast<DM *>(m_pHandler);
          if (pDM != NULL)
          {
               if (pDM->IsIn())
               {
                    return pDM->HandleRequest(pRequest);
               }
          }
          cout<<"PS said:OK."<<endl;
          return true;
     }
private:
     Manager *m_pHandler;
};
int main()
{
     DM *pDM = new DM(NULL);
     PS *pPS = new PS(pDM);
     PM *pPM = new PM(pPS);
     HolidayRequest *pHolidayRequest = new HolidayRequest(10);
     pPM->HandleRequest(pHolidayRequest);
     SAFE_DELETE(pHolidayRequest);
 
     pHolidayRequest = new HolidayRequest(2);
     pPM->HandleRequest(pHolidayRequest);
 
     SAFE_DELETE(pDM);
     SAFE_DELETE(pPS);
     SAFE_DELETE(pPM);
     SAFE_DELETE(pHolidayRequest);
}

優(yōu)缺點(diǎn)

1.降低耦合度;職責(zé)鏈模式使得一個(gè)對(duì)象不用知道是哪一個(gè)對(duì)象處理它的請(qǐng)求。對(duì)象僅需要知道該請(qǐng)求會(huì)被正確的處理。接收者和發(fā)送者都沒有對(duì)方的明確的信息,且鏈中的對(duì)象不需要知道鏈的結(jié)構(gòu);

2.增強(qiáng)了給對(duì)象指派職責(zé)的靈活性;當(dāng)在對(duì)象中分派職責(zé)時(shí),職責(zé)鏈給你更多的靈活性。你可以通過在運(yùn)行時(shí)對(duì)該鏈進(jìn)行動(dòng)態(tài)的增加或修改來增加或改變處理一個(gè)請(qǐng)求的那些職責(zé);

3.不保證被接受,既然一個(gè)請(qǐng)求沒有明確的接收者,那么就不能保證它一定會(huì)被處理;該請(qǐng)求可能一直到鏈的末端都得不到處理。一個(gè)請(qǐng)求也可能因該鏈沒有被正確配置而得不到處理。

總結(jié)

職責(zé)鏈模式在實(shí)現(xiàn)時(shí),需要處理好它的后繼者的問題,就是說,如果我不處理這個(gè)請(qǐng)求,那么我將把這個(gè)請(qǐng)求發(fā)給誰去處理呢?同時(shí),職責(zé)鏈模式在實(shí)現(xiàn)時(shí),它的鏈的形狀并不是由職責(zé)鏈本身建立和維護(hù)的,而是由客戶進(jìn)行創(chuàng)建的,由客戶指定每一個(gè)處理者的后繼者是誰。這就大大的提高了職責(zé)鏈的靈活性。在實(shí)際中,我們也可以將職責(zé)鏈模式與組合模式相結(jié)合,一個(gè)構(gòu)件的父構(gòu)件可以作為它的后繼者。

您可能感興趣的文章:

相關(guān)文章

  • C/CPP運(yùn)算優(yōu)先級(jí)的坑及解決

    C/CPP運(yùn)算優(yōu)先級(jí)的坑及解決

    這篇文章主要介紹了C/CPP運(yùn)算優(yōu)先級(jí)的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • c語言 malloc函數(shù)詳解

    c語言 malloc函數(shù)詳解

    這篇文章主要介紹了c語言 malloc函數(shù)詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • LeetCode題解C++生成每種字符都是奇數(shù)個(gè)的字符串

    LeetCode題解C++生成每種字符都是奇數(shù)個(gè)的字符串

    這篇文章主要為大家介紹了LeetCode題解C++生成每種字符都是奇數(shù)個(gè)的字符串示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • C語言實(shí)現(xiàn)紙牌游戲(小貓釣魚)

    C語言實(shí)現(xiàn)紙牌游戲(小貓釣魚)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)紙牌游戲,小貓釣魚游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • C語言:利用指針編寫程序,用梯形法計(jì)算給定的定積分實(shí)例

    C語言:利用指針編寫程序,用梯形法計(jì)算給定的定積分實(shí)例

    今天小編就為大家分享一篇C語言:利用指針編寫程序,用梯形法計(jì)算給定的定積分實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • C++實(shí)現(xiàn)多項(xiàng)式相乘

    C++實(shí)現(xiàn)多項(xiàng)式相乘

    這篇文章主要介紹了C++實(shí)現(xiàn)多項(xiàng)式相乘方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • C++通過COM接口操作PPT

    C++通過COM接口操作PPT

    這篇文章主要為大家詳細(xì)介紹了C++通過COM接口操作PPT的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Linux配置C++11編譯環(huán)境的方法

    Linux配置C++11編譯環(huán)境的方法

    這篇文章主要介紹了Linux配置C++11編譯環(huán)境,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • socket多人聊天程序C語言版(一)

    socket多人聊天程序C語言版(一)

    這篇文章主要為大家詳細(xì)介紹了socket多人聊天程序C語言版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • C語言實(shí)現(xiàn)掃雷小游戲(擴(kuò)展版可選擇游戲難度)

    C語言實(shí)現(xiàn)掃雷小游戲(擴(kuò)展版可選擇游戲難度)

    游戲目標(biāo)是找出所有沒有地雷的方格,完成游戲;要是按了有地雷的方格,游戲失敗;玩家可標(biāo)記雷的位置,游戲以完成時(shí)間來評(píng)高低,并且用戶可以選擇游戲難度
    2019-10-10

最新評(píng)論