【设计模式】职责链模式<初探>

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

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

头文件

/************************************************* 
Copyright:FZUIM
Author:fzuim
Date:20170310
Description:C++设计模式:职责链.h文件
**************************************************/ 
#ifndef _MANGERMODE_H_
#define _MANGERMODE_H_

#include <iostream>
#include <string>
using namespace std;

//<抽象管理者类
class Manage
{
public:
	Manage(string v_szName, Manage* v_pManage); //抽象出,管理者名字和上级管理者
	virtual ~Manage(){}
public:
	virtual void DealWithRequest(string v_szName, int v_nNum){} //处理请假请求接口
protected:
	string m_szName; // 管理者名字
	Manage* m_pManage; //管理者的上级
};

//<总经理类
class Boss : public Manage
{
public:
	Boss(string v_szName, Manage* v_pManage) : Manage(v_szName, v_pManage){}
	~Boss(){}
public:
	void DealWithRequest(string v_szName, int v_nNum);
};

//<总监类
class Majordomo : public Manage
{
public:
	Majordomo(string v_szName, Manage* v_pManage) : Manage(v_szName, v_pManage){}
	~Majordomo(){}
public:
	void DealWithRequest(string v_szName, int v_nNum);
};

//<经理类
class Leader : public Manage
{
public:
	Leader(string v_szName, Manage* v_pManage) : Manage(v_szName, v_pManage){}
	~Leader(){}
public:
	void DealWithRequest(string v_szName, int v_nNum);
};

#endif

cpp文件

/************************************************* 
Copyright:FZUIM
Author:fzuim
Date:20170310
Description:C++设计模式:职责链.cpp文件
**************************************************/ 
#include "ManagerMode.h"

//<管理者类,属性设置
Manage::Manage( string v_szName, Manage* v_pManage )
{
	m_szName = v_szName;
	m_pManage = v_pManage;
}

//<经理处理请假天数3天内的请求
void Leader::DealWithRequest( string v_szName, int v_nNum )
{
	if(v_nNum < 3)
	{
		cout << "Leader:" << m_szName << " approve " << v_szName << " Leave:" << v_nNum << endl;
	}
	else
	{
		cout << "Leader:" << m_szName <<" Can not be approved, to the superior!" << endl;
		m_pManage->DealWithRequest(v_szName, v_nNum);
	}
}

//<总监类处理请假天数7天内的请求
void Majordomo::DealWithRequest( string v_szName, int v_nNum )
{
	if(v_nNum < 7)
	{
		cout << "Majordomo:" << m_szName << " approve " << v_szName << " Leave:" << v_nNum << endl;
	}
	else
	{
		cout << "Majordomo:" << m_szName <<" Can not be approved, to the superior!" << endl;
		m_pManage->DealWithRequest(v_szName, v_nNum);
	}
}

//<总经理类处理所有请假请求
void Boss::DealWithRequest( string v_szName, int v_nNum )
{
	cout << "Boss:" << m_szName << " approve " << v_szName << " Leave:" << v_nNum << endl;
}

int main()
{
	Manage* pBoss = new Boss("huangdq", NULL); //<总经理,上级设置为NULL
	Manage* pMajordomo = new Majordomo("lill", pBoss); //<总监,上级设置为总经理
	Manage* pLeader = new Leader("lindd", pMajordomo); //<经理,上级设置为总监

	pLeader->DealWithRequest("wango", 8);
	pLeader->DealWithRequest("zhaoxj", 2);
	pLeader->DealWithRequest("helt", 6);
	delete pLeader;
	delete pMajordomo;
	delete pBoss;
	system("pause");
	return 0;
}

 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值