(一)职责链模式学习
来源:互联网 发布:堆排序算法n 编辑:程序博客网 时间:2024/06/16 22:57
//职责链模式:一种将处理同一个请求的多个对象串连起来的设计模式。它使得请求只与多个对象中的一个交互,而不用让请求与多个对象都发生交互,从而避免了一个请求与多个对象的耦合。
// 首先定义要处理的请求(可以将该请求封装于一个类中)
// 然后定义抽象的处理该请求的类, 此类中有一个成员变量和一个“设置继任处理者”的方法,以及“处理请求”接口,处理请求接收“请求的类”为形参
// 再定义几个具体的处理该请求的类,类中都实现了“处理请求”接口,其中进行必要的条件判断,如果能够处理,则处理,如果不能处理,调用其继任者的“处理请求”方法。
//在类用户的处理中,利用“设置继任者”方法,设置对请求进行处理的链条,这样就很灵活了,在客户代码中可以灵活的对请求处理进行修改。
#ifndef _CHAIN_OF_RESPONSEBILITY_H_
#define _CHAIN_OF_RESPONSEBILITY_H_
#include <string>
#include <iostream>
using std::string;
using std::cout;
using std::endl;
//定义被处理的类----请求类
class StaffRequest
{
public:
StaffRequest(){}
StaffRequest(string name, string type, int req_amount):name_(name),req_type_(type),req_amount_(req_amount) {}
//protected:
string name_;
string req_type_;
int req_amount_;
};
//定义抽象的功能类---它处理请求类,实现职能----
//它必须定义两个接口:1. 定义了对请求类进行相关处理的接口
// 2. 设置一下个实现职能的对象实例
class AbstractSupervisor
{
protected:
AbstractSupervisor *NextProcessor;
string name_;
public:
AbstractSupervisor(){}
AbstractSupervisor(string name):name_(name){}
void SetNextDoer(AbstractSupervisor *np){NextProcessor = np;}
virtual void DealStaffRequest(StaffRequest & staff_req) = 0;
};
//定义几个具体的实现职能的类---它们都实现抽象类规定的“实现职能,处理请求”接口
//每一个具体职能类,都完成自己“能力范围内”的事务,对于其它事务,交给其“继任者”处理
class JuniorManager : public AbstractSupervisor
{
public:
JuniorManager(string name):AbstractSupervisor(name){}
void DealStaffRequest(StaffRequest & staff_req);
};
class SuperVisor : public AbstractSupervisor
{
public:
SuperVisor(string name):AbstractSupervisor(name){}
void DealStaffRequest(StaffRequest &staff_req);
};
class GeneralManager : public AbstractSupervisor
{
public:
GeneralManager(string name):AbstractSupervisor(name){}
void DealStaffRequest(StaffRequest & staff_req);
};
#endif
#include "ChainOfResponsibility.h"
//每一个处理者,对自己“职责范围”内的请求进行处理,而对于其它情况,则调用“继任者”的“处理请求”接口!
void JuniorManager::DealStaffRequest(StaffRequest & staff_req)
{
if (staff_req.req_type_ == "leave")
{
cout<<"Junior manager approved the staff request:\t"<<staff_req.req_type_<<"\t"<<staff_req.req_amount_<<endl;
}
else
{
if (NextProcessor != nullptr)
{
NextProcessor->DealStaffRequest(staff_req);
}
}
}
void SuperVisor::DealStaffRequest(StaffRequest & staff_req)
{
if (staff_req.req_type_ == "salary")
{
cout<<"Supervisor approved the staff request:\t" \
<<staff_req.req_type_<<"\t"<<staff_req.req_amount_<<endl;
}
else
{
if (NextProcessor != nullptr)
{
NextProcessor->DealStaffRequest(staff_req);
}
}
}
void GeneralManager::DealStaffRequest(StaffRequest & staff_req)
{
cout<<"General manager approved the staff request\t"
<<staff_req.req_type_<<"\t"<<staff_req.req_amount_<<endl;
}
int main()
{
StaffRequest staff_req("jin","leave",2);
JuniorManager jm("jm");
SuperVisor sv("sv");
GeneralManager gm("gm");
//在客户代码中对每一个职能对象设置其“后继者”,使之成为一个“链条”。在客户代码中现在“职责链”设置,增强了“链”的灵活性
jm.SetNextDoer(&sv);
sv.SetNextDoer(&gm);
jm.DealStaffRequest(staff_req);
staff_req.req_type_ = "leave";
staff_req.req_amount_ = 20;
jm.DealStaffRequest(staff_req);
staff_req.req_type_ = "others";
staff_req.req_amount_ = 10000;
jm.DealStaffRequest(staff_req);
return 0;
}
- (一)职责链模式学习
- 设计模式之---职责链模式(一)
- 职责链模式学习笔记
- 职责链模式(一):采购单的分级审批
- 设计模式学习----职责链模式
- 设计模式入门学习 职责链模式
- 设计模式学习(十六):职责链模式
- 设计模式学习笔记--职责链模式
- 设计模式学习--职责链模式
- 设计模式学习之设计模式原则(一):单一职责原则和里氏替换原则
- 设计模式(一):单一职责原则
- 设计模式(一)单一职责原则
- 职责链模式(二):职责链模式概述
- 职责链模式(ChainOfResponsibity)
- 职责链模式(变种)
- 职责链模式(python)
- 职责链模式(23)
- 职责链模式(23)
- OpenCV基础篇之使用CMake管理工程
- OpenCV基础篇之查找表
- endl
- L3:01 - Binary Tree DFS Traversal
- (二)抽象工厂学习心得
- (一)职责链模式学习
- CentOS上编译安装OpenCV-2.3.1与ffmpeg-2.1.2
- L3:02 - Divide & Conquer Algorithm
- OpenCV基础篇之读取显示图片
- OpenCV基础篇之像素操作对比度调节
- Linux学习记录(一)
- L3:03 - Maximum Depth of Binary Tree
- DSP/BIOS使用之初窥门径——滴答时钟及烧写Flash
- Linux学习记录(二)