zoukankan      html  css  js  c++  java
  • 020 --- 第24章 职责链模式

    简述:

      职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

      职责链模式包括:处理请示接口类、具体处理者类。

        处理请示接口类:定义处理请求的接口。

        具体处理者类:继承自处理请示接口类,处理它所负责的请求,可访问它的后继者,如果可处理该请求,就处理之,否则就将该请求转发给它的后继者。

    职责链模式:

     1 #include <iostream>
     2 using namespace std;
     3 
     4 // 处理请示接口类
     5 class CHandler
     6 {
     7 protected:
     8     CHandler* m_pSuccessor;
     9 
    10 public:
    11     void SetSuccessor(CHandler* pSuccessor)
    12     {
    13         m_pSuccessor = pSuccessor;
    14     }
    15 
    16     virtual void HandlerRequest(int nRquest) = 0;
    17 };
    18 
    19 // 具体处理者类
    20 class CConcreteHandler1 : public CHandler
    21 {
    22 public:
    23     virtual void HandlerRequest(int nRquest)
    24     {
    25         if (nRquest >= 0 && nRquest < 10)
    26             cout << "Handler1 处理请求 " << nRquest << endl;
    27         else if (m_pSuccessor != NULL)
    28             m_pSuccessor->HandlerRequest(nRquest);
    29     }
    30 };
    31 
    32 // 具体处理者类
    33 class CConcreteHandler2 : public CHandler
    34 {
    35 public:
    36     virtual void HandlerRequest(int nRquest)
    37     {
    38         if (nRquest >= 10 && nRquest < 20)
    39             cout << "Handler2 处理请求 " << nRquest << endl;
    40         else if (m_pSuccessor != NULL)
    41             m_pSuccessor->HandlerRequest(nRquest);
    42     }
    43 };
    44 
    45 // 具体处理者类
    46 class CConcreteHandler3 : public CHandler
    47 {
    48 public:
    49     virtual void HandlerRequest(int nRquest)
    50     {
    51         if (nRquest >= 20 && nRquest < 30)
    52             cout << "Handler3 处理请求 " << nRquest << endl;
    53         else if (m_pSuccessor != NULL)
    54             m_pSuccessor->HandlerRequest(nRquest);
    55     }
    56 };
    57 
    58 int main()
    59 {
    60     CConcreteHandler1 Handler1;
    61     CConcreteHandler2 Handler2;
    62     CConcreteHandler3 Handler3;
    63     Handler1.SetSuccessor(&Handler2);
    64     Handler2.SetSuccessor(&Handler3);
    65 
    66     int requests[] = {2, 5, 14, 22, 18, 3, 27, 20};
    67 
    68     for (auto request : requests)
    69         Handler1.HandlerRequest(request);
    70 
    71     system("pause");
    72     return 0;
    73 }

    输出结果:

    例:员工请求加薪

    代码如下:

      1 #include <iostream>
      2 using namespace std;
      3 
      4 // 请求类
      5 class CRequest
      6 {
      7 private:
      8     string m_szRequestType; // 申请类别
      9     string m_szRequestContent; // 申请内容
     10     int m_nNumber; // 数量
     11 
     12 public:
     13     void SetRequestType(string szRequestType) { m_szRequestType = szRequestType; }
     14 
     15     string GetRequestType() { return m_szRequestType; }
     16 
     17     void SetRequestContent(string szRequestContent) { m_szRequestContent = szRequestContent; }
     18 
     19     string GetRequestContent() { return m_szRequestContent; }
     20 
     21     void SetNumber(int nNumber) { m_nNumber = nNumber; }
     22 
     23     int GetNumber() { return m_nNumber; }
     24 };
     25 
     26 // 管理者(处理请示接口类)
     27 class CManager
     28 {
     29 protected:
     30     string m_szName;
     31     CManager* m_pSuperior; // 管理者上级
     32 
     33 public:
     34     CManager(string szName) { m_szName = szName; }
     35 
     36     // 设置管理者上级
     37     void SetSuperior(CManager* pSuperior)     { m_pSuperior = pSuperior; }
     38 
     39     // 处理请求
     40     virtual void RequestApplications(CRequest* pRequest) = 0;
     41 };
     42 
     43 // 经理(具体处理类)
     44 class CCommonManager : public CManager
     45 {
     46 public:
     47     CCommonManager(string name) : CManager(name) {}
     48 
     49     virtual void RequestApplications(CRequest* pRequest)
     50     {
     51         if (pRequest->GetRequestType() == "请假" && pRequest->GetNumber() <= 2)
     52             cout << m_szName << ":" << pRequest->GetRequestContent() << " 数量 " << pRequest->GetNumber() << " 被批准" << endl;
     53         else
     54         {
     55             if (m_pSuperior != NULL)
     56                 m_pSuperior->RequestApplications(pRequest);
     57         }
     58     }
     59 };
     60 
     61 // 总监(具体处理类)
     62 class CMajordomo: public CManager
     63 {
     64 public:
     65     CMajordomo(string name) : CManager(name) {}
     66 
     67     virtual void RequestApplications(CRequest* pRequest)
     68     {
     69         if (pRequest->GetRequestType() == "请假" && pRequest->GetNumber() <= 5)
     70             cout << m_szName << ":" << pRequest->GetRequestContent() << " 数量 " << pRequest->GetNumber() << " 被批准" << endl;
     71         else
     72         {
     73             if (m_pSuperior != NULL)
     74                 m_pSuperior->RequestApplications(pRequest);
     75         }
     76     }
     77 };
     78 
     79 // 总经理(具体处理类)
     80 class CGeneralManager : public CManager
     81 {
     82 public:
     83     CGeneralManager(string name) : CManager(name) {}
     84 
     85     virtual void RequestApplications(CRequest* pRequest)
     86     {
     87         if (pRequest->GetRequestType() == "请假")
     88             cout << m_szName << ":" << pRequest->GetRequestContent() << " 数量 " << pRequest->GetNumber() << " 被批准" << endl;
     89         else if (pRequest->GetRequestType() == "加薪" && pRequest->GetNumber() <= 500)
     90             cout << m_szName << ":" << pRequest->GetRequestContent() << " 数量 " << pRequest->GetNumber() << " 被批准" << endl;
     91         else if (pRequest->GetRequestType() == "加薪" && pRequest->GetNumber() > 500)
     92             cout << m_szName << ":" << pRequest->GetRequestContent() << " 数量 " << pRequest->GetNumber() << " 再说吧" << endl;
     93     }
     94 };
     95 
     96 int main()
     97 {
     98     CCommonManager JinLi("金利");
     99     CMajordomo ZongJian("宗剑");
    100     CGeneralManager ZhongJingLi("钟精励");
    101     JinLi.SetSuperior(&ZongJian);
    102     ZongJian.SetSuperior(&ZhongJingLi);
    103 
    104     CRequest Request;
    105     Request.SetRequestType("请假");
    106     Request.SetRequestContent("GHL请假");
    107     Request.SetNumber(1);
    108     JinLi.RequestApplications(&Request);
    109 
    110     CRequest Request2;
    111     Request2.SetRequestType("请假");
    112     Request2.SetRequestContent("GHL请假");
    113     Request2.SetNumber(4);
    114     JinLi.RequestApplications(&Request2);
    115 
    116     CRequest Request3;
    117     Request3.SetRequestType("加薪");
    118     Request3.SetRequestContent("GHL请求加薪");
    119     Request3.SetNumber(500);
    120     JinLi.RequestApplications(&Request3);
    121 
    122     CRequest Request4;
    123     Request4.SetRequestType("加薪");
    124     Request4.SetRequestContent("GHL请求加薪");
    125     Request4.SetNumber(1000);
    126     JinLi.RequestApplications(&Request4);
    127 
    128     system("pause");
    129     return 0;
    130 }

    输出结果:

  • 相关阅读:
    LG4377 「USACO2018OPEN」Talent Show 分数规划+背包
    LG4111/LOJ2122 「HEOI2015」小Z的房间 矩阵树定理
    LG5104 红包发红包 概率与期望
    LG2375/LOJ2246 「NOI2014」动物园 KMP改造
    LG4824 「USACO2015FEB」(Silver)Censoring KMP+栈
    20191004 「HZOJ NOIP2019 Round #9」20191004模拟
    LG5357 「模板」AC自动机(二次加强版) AC自动机+fail树
    LG3812 「模板」线性基 线性基
    数据结构
    git
  • 原文地址:https://www.cnblogs.com/SmallAndGreat/p/13649933.html
Copyright © 2011-2022 走看看