我与C++设计模式(二十)——职责链模式
来源:互联网 发布:英菲克安装软件密码 编辑:程序博客网 时间:2024/05/29 04:34
过了visitor模式,后面的模式就没有那么险山恶水了,不是说后面的简单,是之前的那些总有些听得太多却一直空洞不懂,一直以来都是不明觉厉的,后面的模式全当新玩意儿,反而不怕了,也可能是没来得及怕,容不得我不明觉厉。
扯了,chain of responsibility模式起因是从MFC的例子开始的,对于MFC的消息响应机制是VC的入门课,从一个消息到达,经过层层传递决定处理者的过程就是一条职责链,UML图如下:
Handler是接口,其子类接到请求后可以处理,也可以“扔锅”。每个concreteHandler都会有一个“接锅人”成员属性,在自己无法处理的时候,可以对其扔锅。
代码如下:
#ifndef _HANDLE_H__#define _HANDLE_H__class handler{ public: virtual ~handler(); virtual void handle_request() = 0; virtual void set_successor(handler *); virtual handler *get_successor(); protected: handler(); handler(handler *); private: handler *_p_successor; //接锅人};class concrete_handler_A:public handler{ public: concrete_handler_A(); concrete_handler_A(handler *); ~concrete_handler_A(); void handle_request();};class concrete_handler_B:public handler{ public: concrete_handler_B(); concrete_handler_B(handler *); ~concrete_handler_B(); void handle_request();};#endif
//handler.cpp#include "handler.h"#include <iostream>using namespace std;handler::handler() :_p_successor(0){}handler::handler(handler *p_succ) :_p_successor(p_succ){}handler::~handler(){}void handler::set_successor(handler *p_succ){ _p_successor = p_succ;}handler *handler::get_successor(){ return _p_successor;}//--------------A--------------concrete_handler_A::concrete_handler_A(){}concrete_handler_A::concrete_handler_A(handler *p_succ) :handler(p_succ){}concrete_handler_A::~concrete_handler_A(){}void concrete_handler_A::handle_request(){ if (get_successor() != 0) { cout<<"A: SUCCESSOR DOING"<<endl; get_successor()->handle_request(); } else { cout<<"A: I'M THE LAST ONE"<<endl; cout<<"A: I WILL DEAL WITH IT"<<endl; }}//--------------B---------------concrete_handler_B::concrete_handler_B(){}concrete_handler_B::concrete_handler_B(handler *p_succ) :handler(p_succ){}concrete_handler_B::~concrete_handler_B(){}void concrete_handler_B::handle_request(){ if (get_successor() != 0) { cout<<"B: SUCCESSOR DOING"<<endl; get_successor()->handle_request(); } else { cout<<"B: I'M THE LAST ONE"<<endl; cout<<"B: I WILL DEAL WITH IT"<<endl; }}
//main.cpp#include "handler.h"int main(int argc,char **argv){ handler *p_h1 = new concrete_handler_A(); handler *p_h2 = new concrete_handler_B(); p_h1->set_successor(p_h2); p_h1->handle_request(); return 0;}
输出结果:
$ ./handler.exeA: SUCCESSOR DOINGB: I'M THE LAST ONEB: I WILL DEAL WITH IT
0 0
- 我与C++设计模式(二十)——职责链模式
- 设计模式(二十)——职责链模式
- 设计模式笔记(二十) —— 职责链模式
- 设计模式(二十)职责链模式
- 二十、职责链模式——设计模式学习笔记
- 设计模式C++实现二十:职责链模式
- (二十)职责链模式
- 二十、职责链模式
- 设计模式实现(二十)---职责链模式(Chain of Responsibility)
- 设计模式学习笔记二十(Chain of Responsibility职责链模式)
- 设计模式—责任链模式(二十)
- 《设计模式》——职责链模式
- 设计模式——职责链模式
- 设计模式——职责链模式
- 设计模式——职责链模式
- 设计模式——职责链模式
- 设计模式原则—单一职责原则(二)
- 大话设计模式-----(十)职责链模式、中介者模式
- 轻松学算法6:只有五行的Floyd最短路算法
- Sizeof与Strlen的区别与联系
- 黑马程序员---------------------异常
- wxPython中单元格示例
- nyoj 883 取石子(七)博弈论问题
- 我与C++设计模式(二十)——职责链模式
- 一分钟教你在博客园中制作自己的动态云球形标签页
- 【自白贴】这是我的第一篇博文
- sicily 2503. 最长字符串
- 轻松学算法7:Dijkstra最短路算法
- 深入理解javascript原型和闭包(16)——完结
- JScrollPane,JComboBox透明
- 数据结构--堆排序
- 算法8:图还可以这样存——邻接表的数组实现