职责链模式

时间:2022-04-26
本文章向大家介绍职责链模式,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

一、简介

1、当客户提交一个请求时,请求沿着链传递直到有一个管理者对象处理它。

2、UML

3、所属类别:行为型

二、程序

  1 // 职责链模式.cpp : 定义控制台应用程序的入口点。
  2 //
  3 
  4 #include "stdafx.h"
  5 #include<iostream>
  6 #include<string>
  7 using namespace std;
  8 class Request
  9 {
 10 public:
 11     string requesttype;
 12     Request(string s)
 13     {
 14          requesttype=s;
 15     }
 16     ~Request(){}
 17 };
 18 //管理者抽象类
 19 class Manager
 20 {
 21 public:
 22     Manager* super_manager;//本级管理者的上一级管理者
 23     Manager(){}
 24     virtual ~Manager(){}
 25     virtual void requestapplication(Request *)=0;
 26 };
 27 //具体的管理者
 28 class Xiangmujingli :public Manager
 29 {
 30 public:
 31     Xiangmujingli(){}
 32     virtual ~Xiangmujingli(){}
 33     virtual void requestapplication(Request *r)
 34     {
 35         cout<<"我是项目经理,";
 36         if(r->requesttype=="请假")
 37         {
 38             cout<<"你的请求,我准了"<<endl;
 39         }
 40         else
 41         {
 42             cout<<"你的请求我无权管理"<<endl;
 43             super_manager->requestapplication(r);
 44         }
 45     }
 46 };
 47 //具体的管理者
 48 class Zongjingli :public Manager
 49 {
 50 public:
 51     Zongjingli(){}
 52     virtual ~Zongjingli(){}
 53     virtual void requestapplication(Request *r)
 54     {
 55         cout<<"我是总经理,";
 56         if(r->requesttype=="加薪")
 57         {
 58             cout<<"你的请求,我准了"<<endl;
 59         }
 60         else
 61         {
 62             cout<<"你的请求我无权管理"<<endl;
 63             super_manager->requestapplication(r);
 64         }
 65     }
 66 };
 67 //具体的管理者
 68 class CEO :public Manager
 69 {
 70 public:
 71     CEO(){}
 72     virtual ~CEO(){}
 73     virtual void requestapplication(Request *r)
 74     {
 75         cout<<"我是CEO,";
 76         if(r->requesttype=="入股")
 77         {
 78             cout<<"你的请求,我准了"<<endl;
 79         }
 80         else
 81         {
 82             cout<<"你的请求我无权管理"<<endl;
 83             super_manager->requestapplication(r);
 84         }
 85     }
 86 };
 87 
 88 int _tmain(int argc, _TCHAR* argv[])
 89 {
 90     Request *request=new Request("加薪");
 91     //实例化所有管理者
 92     Xiangmujingli* xiangmujingli=new Xiangmujingli();
 93     Zongjingli *zongjingli=new Zongjingli();
 94     CEO * ceo=new CEO();
 95     //设置上下级关系
 96     xiangmujingli->super_manager=zongjingli;
 97     zongjingli->super_manager=ceo;
 98     //寻找最下级的管理者
 99     xiangmujingli->requestapplication(request);
100     return 0;
101 }