(一)职责链模式学习

来源:互联网 发布:堆排序算法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;
}

0 0
原创粉丝点击