设计模式(c++)笔记之二十一(Chain of Responsibility模式)
来源:互联网 发布:网络语言古文翻译 编辑:程序博客网 时间:2024/05/19 12:40
一、描述:
概念:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。
Chain of Responsibility 模式典型的结构图为:
Chain of Responsibility模式中ConcreteHandler将自己的后继对象(向下传递消息的对象)记录在自己的后继表中,当一个请求到来时,ConcreteHandler 会先检查看自己有没有匹配的处理程序,如果有就自己处理,否则传递给它的后继。当然这里示例程序中为了简化,ConcreteHandler 只是简单的检查看自己有没有后继,有的话将请求传递给后继进行处理,没有的话就自己处理。
二、实例:
中国古代对妇女制定了“三从四德”的道德规范,“三从”是指“未嫁从父、既嫁从夫、夫死从子”,也就是说一个女性,在没有结婚的时候要听从于父亲,结了婚后听从于丈夫,丈夫死了还要听儿子的,举个例子来说,一个女的要出去逛街,同样这样的一个请求,在她没有出嫁前她必须征得父亲的同意,出嫁之后必须获得丈夫的许可,那丈夫死了怎么办?一般都是男的比女的死的早,还要问问儿子是否允许自己出去逛街,估计你下边马上要问要是没有儿子怎么办?请示小叔子、侄子等等,在父系社会中,妇女只占从属地位,现在想想中国的妇女还是比较悲惨的,逛个街还要请示来请示去,而且作为父亲、丈夫、儿子只有两种选择:要不承担起责任来告诉她允许或不允许逛街,要不就让她请示下一个人,这是整个社会体系的约束,应用到我们项目中就是业务规则,那我们来看怎么把“三从”通过我们的程序来实现,需求很简单:通过程序描述一下古代妇女的“三从”制度,好我们先看类图:
main(),客户
IWomen,发出请求者接口
CWomen,请求者实现类
CHandler,处理请求抽象类
CFather,处理请求实现类,责任链之一
CHusband,处理请求实现类,责任链之二
CSon,处理请求实现类,责任链之三
说明:CHandler抽象类负责聚合责任链之中的其它处理对象,用SetNext来建立这个责任链。HandleMessage在处理请求时,会判断是否是自己要处理的请求,如果是则直接处理。如果不是,则查找下一个责任链上的处理对象,找到了则由下一个处理。
我的工程目录:
发出请求者接口:IWomen类
IWomen.h
#ifndef __Chain_of_Responsibility__IWomen__#define __Chain_of_Responsibility__IWomen__#include <iostream>using std::string;class IWomen{public: IWomen(void) { } virtual ~IWomen(void) { } //获得个人状况 virtual int GetType() = 0; //获得个人请示,你要干什么?出去逛街?约会?还是看电影 virtual string GetRequest() = 0;};#endif /* defined(__Chain_of_Responsibility__IWomen__) */
请求者实现类:CWomen类
CWomen.h
#ifndef __Chain_of_Responsibility__Women__#define __Chain_of_Responsibility__Women__#include <iostream>#include "IWomen.h"using std::string;class CWomen :public IWomen{public: CWomen(int _type, string _request); ~CWomen(void); int GetType(); //获得自己的状况 string GetRequest(); //获得妇女的请求private: /* 1---未出嫁;2---出嫁;3---夫死*/ int m_type; //妇女的请示 string m_request;};#endif /* defined(__Chain_of_Responsibility__Women__) */CWomen.cpp
#include "Women.h"CWomen::CWomen( int _type, string _request ){ this->m_type = _type; switch (this->m_type) { case 1: this->m_request.append("女儿的请求是:"); this->m_request.append(_request); break; case 2: this->m_request.append("妻子的请求是:"); this->m_request.append(_request); break; case 3: this->m_request.append("母亲的请求是:"); this->m_request.append(_request); break; }}CWomen::~CWomen(void){}int CWomen::GetType(){ return m_type;}string CWomen::GetRequest(){ return m_request;}
处理请求抽象类:CHandler类
CHandler.h
#ifndef __Chain_of_Responsibility__Handler__#define __Chain_of_Responsibility__Handler__#include <iostream>#include "IWomen.h"class CHandler{public: CHandler(int _level); virtual ~CHandler(void); void HandleMessage(IWomen *pwomen); void SetNext(CHandler *phandler); virtual void Response(IWomen *pwomen) = 0;private: int m_level; //能处理的级别 CHandler *m_pNextHandler; //责任传递,下一个人责任人是谁};#endif /* defined(__Chain_of_Responsibility__Handler__) */CHandler.cpp
#include "Handler.h"using std::cout;using std::endl;//每个类都要说明一下自己能处理哪些请求CHandler::CHandler(int _level ) : m_level(_level){ m_pNextHandler = NULL;}CHandler::~CHandler(void){}//一个女性(女儿,妻子或者是母亲)要求逛街,你要处理这个请求void CHandler::HandleMessage( IWomen *pwomen ){ if (pwomen->GetType() == this->m_level) { this->Response(pwomen); } else { if(this->m_pNextHandler != NULL) this->m_pNextHandler->HandleMessage(pwomen); else cout << "----------没地方请示了,不做处理!----------" << endl; }}/* * 如果你属于你处理的返回,你应该让她找下一个环节的人,比如 * 女儿出嫁了,还向父亲请示是否可以逛街,那父亲就应该告诉女儿,应该找丈夫请示 */void CHandler::SetNext( CHandler *phandler ){ m_pNextHandler = phandler;}
处理请求实现类,责任链之一(父亲):CFather类
CFather.h
#ifndef __Chain_of_Responsibility__Father__#define __Chain_of_Responsibility__Father__#include <iostream>#include "Handler.h"#include "IWomen.h"class CFather :public CHandler{public: CFather(void); ~CFather(void); void Response(IWomen *pwomen);};#endif /* defined(__Chain_of_Responsibility__Father__) */CFather.cpp
#include "Father.h"using std::cout;using std::endl;CFather::CFather(void) : CHandler(1){}CFather::~CFather(void){}//父亲的答复void CFather::Response( IWomen *pwomen ){ cout << "女儿向父亲请示:" << endl; cout << pwomen->GetRequest().c_str() << endl; cout << "父亲的答复是:同意" << endl;}
处理请求实现类,责任链之二(丈夫):CHusband.h
CHusband.h
#ifndef __Chain_of_Responsibility__Husband__#define __Chain_of_Responsibility__Husband__#include <iostream>#include "handler.h"#include "IWomen.h"class CHusband :public CHandler{public: CHusband(void); ~CHusband(void); void Response(IWomen *pwomen);};#endif /* defined(__Chain_of_Responsibility__Husband__) */CHusband.cpp
#include "Husband.h"using std::cout;using std::endl;CHusband::CHusband(void) : CHandler(2){}CHusband::~CHusband(void){}//丈夫请示的答复void CHusband::Response( IWomen *pwomen ){ cout << "妻子向丈夫请示:" << endl; cout << pwomen->GetRequest().c_str() << endl; cout << "丈夫的答复是:同意" << endl;}
处理请求实现类,责任链之三(儿子):CSon类
CSon.h
#ifndef __Chain_of_Responsibility__Son__#define __Chain_of_Responsibility__Son__#include <iostream>#include "handler.h"#include "IWomen.h"class CSon :public CHandler{public: CSon(void); ~CSon(void); void Response(IWomen *pwomen);};#endif /* defined(__Chain_of_Responsibility__Son__) */CSon.cpp
#include "Son.h"using std::cout;using std::endl;CSon::CSon(void) : CHandler(3){}CSon::~CSon(void){}//儿子的答复void CSon::Response( IWomen *pwomen ){ cout << "母亲向儿子请示:" << endl; cout << pwomen->GetRequest().c_str() << endl; cout << "儿子的答复是:同意" << endl;}
客户:main
#include <iostream>#include "IWomen.h"#include "Women.h"#include "Handler.h"#include "Father.h"#include "Husband.h"#include "Son.h"using std::cout;using std::endl;void DoNew(){ cout << "----------使用模式后的处理方式----------" << endl; //Handler.h, Handler.cpp, IWomen.h, Women.h, Women.cpp, Father.h, Father,cpp, Husband.h, Husband.cpp, Son.h, Son.cpp IWomen *pwomen1 = new CWomen(1, "我要出去逛街"); //女儿向父亲请示 IWomen *pwomen2 = new CWomen(2, "我要出去吃饭"); //已婚少妇,请示丈夫 IWomen *pwomen3 = new CWomen(3, "我也要出去吃饭"); //母亲请示儿子 IWomen *pwomen4 = new CWomen(4, "我也要出去逛街"); //暂时啥也不做 CHandler *pfather = new CFather(); CHandler *phusband = new CHusband(); CHandler *pson = new CSon(); pfather->SetNext(phusband); phusband->SetNext(pson); pfather->HandleMessage(pwomen1); pfather->HandleMessage(pwomen2); pfather->HandleMessage(pwomen3); pfather->HandleMessage(pwomen4); delete pfather; delete phusband; delete pson; delete pwomen1; delete pwomen2; delete pwomen3; delete pwomen4;}int main(int argc, const char * argv[]){ //要实现逻辑判断,即女性的请求先发送到父亲类,父亲类一看是自己要处理的,就回应进行处理。如果女儿已经出嫁了,那就把这个请求转发到女婿类来处理。依此类推,形成了一个责任链。 DoNew(); // insert code here... std::cout << "Hello, World!\n"; return 0;}
结果如下:
参考文献:《设计模式之禅》,《GoF_23种设计模式解析》
参考博客: http://www.cnblogs.com/wanggary/archive/2011/04/20/2022988.html
- 设计模式(c++)笔记之二十一(Chain of Responsibility模式)
- 设计模式之二十一------ chain of responsibility(责任链)
- 23种设计模式之二十一(行为模式)Chain of Responsibility模式
- 设计模式(二十一)chain of responsibility
- 【设计模式】之二Chain of Responsibility
- 设计模式之Chain of Responsibility模式(笔记)
- 设计模式之 Chain of Responsibility 模式
- 设计模式之Chain of Responsibility模式
- 笔记:Gof设计模式--Chain of Responsibility
- 设计模式之职责链模式(Chain Of Responsibility)
- 设计模式之---责任链模式(Chain of Responsibility)
- 设计模式之责任链模式(Chain of Responsibility)
- JAVA设计模式十一--Chain of Responsibility(职责链模式)
- Java设计模式十一: 职责链模式(Chain of Responsibility)
- JAVA设计模式十一:--Chain of Responsibility(职责链模式)
- 设计模式学习笔记二十(Chain of Responsibility职责链模式)
- 设计模式之 chain of responsibility
- 设计模式C++学习笔记之十七(Chain of Responsibility责任链模式)
- H3C:数据中心虚拟化为大二层网络提出新要求
- QQ与微信的移动互联网演义
- IOS多线程读写Sqlite问题解决
- Android系统底层架构【译】
- 简单的数据协议――SDP
- 设计模式(c++)笔记之二十一(Chain of Responsibility模式)
- HashMap
- 可恶的IE bug
- 《SQL反模式》书籍推荐
- url传中文值乱码,获取中文
- AJAX 第一个例子
- 根据Ip地址获取城市名
- java学习之编译时类型(前期绑定)和运行时类型 (后期绑定、动态绑定、运行时绑定)
- iOS中给图片加圆角的方法