文档章节

设计模式C++实现(14)——职责链模式

小代码2016
 小代码2016
发布于 2015/05/24 19:20
字数 695
阅读 15
收藏 0
  软件领域中的设计模式为开发人员提供了一种使用专家设计经验的有效途径。设计模式中运用了面向对象编程语言的重要特性:封装、继承、多态,真正领悟设计 模式的精髓是可能一个漫长的过程,需要大量实践经验的积累。最近看设计模式的书,对于每个模式,用C++写了个小例子,加深一下理解。主要参考《大话设计 模式》和《设计模式:可复用面向对象软件的基础》两本书。本文介绍装饰模式的实现。

       职责链模式:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对 象处理它为止。其思想很简单,考虑员工要求加薪。公司的管理者一共有三级,总经理、总监、经理,如果一个员工要求加薪,应该向主管的经理申请,如果加薪的 数量在经理的职权内,那么经理可以直接批准,否则将申请上交给总监。总监的处理方式也一样,总经理可以处理所有请求。这就是典型的职责链模式,请求的处理 形成了一条链,直到有一个对象处理请求。给出这个例子的UML图。


        代码的实现比较简单,如下所示:

  1. //抽象管理者  
  2. class Manager  
  3. {  
  4. protected:  
  5.     Manager *m_manager;  
  6.     string m_name;  
  7. public:  
  8.     Manager(Manager *manager, string name):m_manager(manager), m_name(name){}  
  9.     virtual void DealWithRequest(string name, int num)  {}  
  10. };  
  11. //经理  
  12. class CommonManager: public Manager  
  13. {  
  14. public:  
  15.     CommonManager(Manager *manager, string name):Manager(manager,name) {}  
  16.     void DealWithRequest(string name, int num)   
  17.     {  
  18.         if(num < 500) //经理职权之内  
  19.         {  
  20.             cout<<"经理"<<m_name<<"批准"<<name<<"加薪"<<num<<"元"<<endl<<endl;  
  21.         }  
  22.         else  
  23.         {  
  24.             cout<<"经理"<<m_name<<"无法处理,交由总监处理"<<endl;  
  25.             m_manager->DealWithRequest(name, num);  
  26.         }  
  27.     }  
  28. };  
  29. //总监  
  30. class Majordomo: public Manager  
  31. {  
  32. public:  
  33.     Majordomo(Manager *manager, string name):Manager(manager,name) {}  
  34.     void DealWithRequest(string name, int num)   
  35.     {  
  36.         if(num < 1000) //总监职权之内  
  37.         {  
  38.             cout<<"总监"<<m_name<<"批准"<<name<<"加薪"<<num<<"元"<<endl<<endl;  
  39.         }  
  40.         else  
  41.         {  
  42.             cout<<"总监"<<m_name<<"无法处理,交由总经理处理"<<endl;  
  43.             m_manager->DealWithRequest(name, num);  
  44.         }  
  45.     }  
  46. };  
  47. //总经理  
  48. class GeneralManager: public Manager  
  49. {  
  50. public:  
  51.     GeneralManager(Manager *manager, string name):Manager(manager,name) {}  
  52.     void DealWithRequest(string name, int num)  //总经理可以处理所有请求  
  53.     {  
  54.         cout<<"总经理"<<m_name<<"批准"<<name<<"加薪"<<num<<"元"<<endl<<endl;  
  55.     }  
  56. };  

         客户调用方式为:

  1. //测试案例  
  2. int main()  
  3. {     
  4.     Manager *general = new GeneralManager(NULL, "A"); //设置上级,总经理没有上级  
  5.     Manager *majordomo = new Majordomo(general, "B"); //设置上级  
  6.     Manager *common = new CommonManager(majordomo, "C"); //设置上级  
  7.     common->DealWithRequest("D",300);   //员工D要求加薪  
  8.     common->DealWithRequest("E", 600);  
  9.     common->DealWithRequest("F", 1000);  
  10.     delete common; delete majordomo; delete general;  
  11.     return 0;  

本文转载自:http://blog.csdn.net/wuzhekai1985/article/details/6673892

小代码2016
粉丝 46
博文 328
码字总数 153495
作品 0
安阳
程序员
私信 提问
Android 网络编程 目录

Android 网络编程 目录 Android 网络编程1 Http协议 Android 网络编程2 Okhttp缓存机制 Android 网络编程3 Java NIO to be continued... Android 架构师之路 目录 Android 架构师之路1 UML图...

香沙小熊
2018/06/21
0
0
《JavaScript设计模式与开发实践》最全知识点汇总大全

系列文章: 《JavaScript设计模式与开发实践》基础篇(1)—— this、call 和 apply 《JavaScript设计模式与开发实践》基础篇(2)—— 闭包和高阶函数 《JavaScript设计模式与开发实践》模式...

嗨呀豆豆呢
01/04
0
0
《JavaScript设计模式与开发实践》原则篇(2)—— 最少知识原则

最少知识原则(LKP)说的是一个软件实体应当尽可能少地与其他实体发生相互作用。这 里的软件实体是一个广义的概念,不仅包括对象,还包括系统、类、模块、函数、变量等。 单一职责原则指导我们...

嗨呀豆豆呢
2018/12/30
0
0
Cocos2d-x设计模式--二段构建模式

设计模式在程序设计中会经常用到,也许你从来没有留意过设计模式,其实你却一直在使用设计模式!cocos2dx中有不少的设计模式,所以从本篇博客开始探讨一下cocos2dx中的设计模式,看看引擎都使...

_子墨
2014/09/15
241
0
设计模式(0)—— 概述

设计模式(Design Pattern),是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。 使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 设计模式于...

长平狐
2013/01/06
88
0

没有更多内容

加载失败,请刷新页面

加载更多

Podman 使用指南

> 原文链接:Podman 使用指南 Podman 原来是 CRI-O 项目的一部分,后来被分离成一个单独的项目叫 libpod。Podman 的使用体验和 Docker 类似,不同的是 Podman 没有 daemon。以前使用 Docker...

米开朗基杨
53分钟前
5
0
拯救 项目经理个人时间的5个技巧

优秀的项目经理都有一个共同点,那就是良好的时间管理能力。专业的项目经理会确保他们的时间投入富有成效,尽可能避免时间浪费。 时间管理叫做GTD,即Getting Things Done——“把事情做完”...

Airship
今天
6
0
LNMP环境介绍,Mariadb安装,服务管理,mariadb安装3

LNMP环境介绍 Nginx 处理的请求有两种,分为 静态与动态 图片,js,css,视频,音频,flash 等都是静态请求,这些数据都不是保存在数据库里面的 动态请求一般来说,需要的数据是在数据库里面...

doomcat
今天
2
0
前端技术之:Prisma Demo服务部署过程记录

安装前提条件: 1、已经安装了docker运行环境 2、以下命令执行记录发生在MackBook环境 3、已经安装了PostgreSQL(我使用的是11版本) 4、Node开发运行环境可以正常工作 首先需要通过Node包管...

popgis
今天
7
0
数组和链表

数组 链表 技巧一:掌握链表,想轻松写出正确的链表代码,需要理解指针获引用的含义: 对指针的理解,记住下面的这句话就可以了: 将某个变量赋值给指针,实际上就是将这个变量的地址赋值给指...

code-ortaerc
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部