zoukankan      html  css  js  c++  java
  • (六)责任链模式-C++实现

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

    责任链模式是使用多个对象处理用户请求的成熟模式,它的关键是将这处理对象组成一个链。每个对象含有后继对象的引用,如果不能处理目前的请求就把它传给后继对象处理。

        该模式中有两种角色:

    1、处理者:是一个接口或者抽象类,规定了具体处理者处理用户请求的方法,还有设置后继对象的方法

    2、具体处理者:是具体的处理者的实现。

        本例子中,是一个查询用户身份证号码的例子,不同的具体处理者代表不同的城市,然后对一个身份证号码的请求进行处理。有三个文件,Handler.h和Handler.cpp以及测试用的ResponsibilityChainTest.cpp

    (1)Handler.h

     1 #ifndef _HANDLER_H_
     2 #define _HANDLER_H_
     3 #include <iostream>
     4 #include <list>
     5 #include <string>
     6 using namespace std;
     7 
     8 /*
     9 责任链模式 
    10 有很多的对象可以处理请求,
    11 但是用户并不感知是那个对象处理了他的请求。
    12 */
    13 
    14 //抽象类
    15 class Handler{
    16 public:
    17     virtual void handleRequest(string number) = 0;
    18     virtual void setNextHandler(Handler* handler) = 0;
    19 };
    20 
    21 
    22 //具体处理者1
    23 class Beijing : public Handler{
    24 public:
    25     Beijing();
    26     void handleRequest(string number) override;
    27     void setNextHandler(Handler* handler) override;
    28 
    29 private:
    30     Handler *myHandler;
    31     list<string> numberList;
    32 };
    33 
    34 //具体处理者2
    35 class Shanghai : public Handler{
    36 public:
    37     Shanghai();
    38     void handleRequest(string number) override;
    39     void setNextHandler(Handler* handler) override;
    40 
    41 private:
    42     Handler *myHandler;
    43     list<string> numberList;
    44 };
    45 
    46 //具体处理者3
    47 class Tianjin : public Handler{
    48 public:
    49     Tianjin();
    50     void handleRequest(string number) override;
    51     void setNextHandler(Handler* handler) override;
    52 
    53 private:
    54     Handler *myHandler;
    55     list<string> numberList;
    56 };
    57 
    58 
    59 
    60 #endif
    View Code

    (2)Handler.cpp

     1 #include "Handler.h"
     2 
     3 Beijing::Beijing()
     4 {
     5     numberList.push_back("11129812340930034");
     6     numberList.push_back("11129812340930035");
     7     numberList.push_back("11129812340930036");
     8     numberList.push_back("11129812340930037");
     9 }
    10 
    11 void Beijing::handleRequest(string number)
    12 {
    13     list<string>::iterator it;
    14     it = find(numberList.begin(), numberList.end(), number);
    15     if (it != numberList.end())//存在
    16     {
    17         cout << "该人在北京居住" << endl;
    18     }
    19     else{
    20         cout << "该人不在北京居住" << endl;
    21         if (NULL != myHandler)
    22         {
    23             myHandler->handleRequest(number);
    24         }
    25     }
    26 }
    27 
    28 void Beijing::setNextHandler(Handler* handler)
    29 {
    30     myHandler = handler;
    31 }
    32 
    33 Shanghai::Shanghai()
    34 {
    35     numberList.push_back("10129812340930031");
    36     numberList.push_back("10129812340930032");
    37     numberList.push_back("10129812340930036");
    38     numberList.push_back("10129812340930037");
    39 }
    40 
    41 void Shanghai::handleRequest(string number)
    42 {
    43     list<string>::iterator it;
    44     it = find(numberList.begin(), numberList.end(), number);
    45     if (it != numberList.end())//存在
    46     {
    47         cout << "该人在上海居住" << endl;
    48     }
    49     else{
    50         cout << "该人不在上海居住" << endl;
    51         if (NULL != myHandler)
    52         {
    53             myHandler->handleRequest(number);
    54         }
    55     }
    56 }
    57 
    58 void Shanghai::setNextHandler(Handler* handler)
    59 {
    60     myHandler = handler;
    61 }
    62 
    63 
    64 
    65 Tianjin::Tianjin()
    66 {
    67     numberList.push_back("10029812340930031");
    68     numberList.push_back("10029812340930032");
    69     numberList.push_back("10029812340930036");
    70     numberList.push_back("10029812340930037");
    71 }
    72 
    73 void Tianjin::handleRequest(string number)
    74 {
    75     list<string>::iterator it;
    76     it = find(numberList.begin(), numberList.end(), number);
    77     if (it != numberList.end())//存在
    78     {
    79         cout << "该人在天津居住" << endl;
    80     }
    81     else{
    82         cout << "该人不在天津居住" << endl;
    83         if (NULL != myHandler)
    84         {
    85             myHandler->handleRequest(number);
    86         }
    87     }
    88 }
    89 
    90 void Tianjin::setNextHandler(Handler* handler)
    91 {
    92     myHandler = handler;
    93 }
    View Code

    (3)ResponsibilityChainTest.cpp

     1 #include "Handler.h"
     2 
     3 int main()
     4 {
     5     //创建责任链
     6     //一般将责任大(最有可能处理用户请求)的对象放在前面
     7     Handler *beijing = new Beijing();
     8     Handler *tianjin = new Tianjin();
     9     Handler *shanghai = new Shanghai();
    10     
    11     beijing->setNextHandler(tianjin);
    12     tianjin->setNextHandler(shanghai);
    13 
    14     //用户进行请求
    15     //从责任链的第一个对象开始
    16     beijing->handleRequest("10129812340930037");
    17 
    18     return 0;
    19 }
    View Code

        责任链的优势:

    1、责任链中对象只和自己的后继是耦合关系,和其他对象毫无关联

    2、在处理中分配职责时,责任链给程序更多的灵活性(将责任大的对象放在责任链的前面)

    3、应用程序可以动态增加或者删除处理者;也可以动态的改变处理者之间的先后顺序

    4、使用责任链的用户不必知道处理者的信息。

        适合责任链的场景:

    1、有很多对象可以处理用户的请求,希望程序在运行时自动确定处理用户请求的那个对象。

    2、程序希望动态定制可处理用户请求的对象集合。

  • 相关阅读:
    P1171 售货员的难题--搜索(剪枝)
    逆元-P3811 【模板】乘法逆元-洛谷luogu
    gcd和exgcd和lcm
    递推
    Docker hello workd
    Docker配置文件详解
    Centos7变动
    centos7安装docker
    nginx性能调优
    nginx相关
  • 原文地址:https://www.cnblogs.com/leewhite/p/6067027.html
Copyright © 2011-2022 走看看