1.说明
请参见第一章节
2.职责链模式说明
职责链模式:是多个对象都有机会处理请求,避免请求发送者和接受者之间的耦合。将这个对象形成一条链,并沿着这条链传递请求,直到一个对象处理他为。就终止上传请求的客户端并不知道这当中的哪一个对象最终处理这个请求,这样系统的更改可以在不影响客户端的情况下动态地重新组织和分配责任。
好处和缺点:接受者和发送者都没有对方的明确信息,且链中的对象不知道链的结构。简化了对象的互相连接,他仅需要保存一个指向其后继者的引用。而不需要保持他所有的候选者的引用,大大的降低了耦合度。这也导致了程序的可读性和逻辑的不连贯。所以在使用的时候,一定注重代码逻辑清晰,否则不方便后期调试
注意:当一个请求到达链的尾端仍然可能得不到处理,需要正确判断。
3.UML
4.代码
//公共基类
#ifndef __MANGER_H
#define __MANGER_H
#include <iostream>
class CManger
{
public:
CManger(CManger* manger):m_manger(manger)
{
}
virtual int ask_holiday(int days) = 0;
virtual int ask_raise(int val) = 0;
CManger* getleader()
{
return m_manger;
}
private:
CManger* m_manger;
};
#endif
//teamleader实现
#ifndef __TEAMLEADER_H
#define __TEAMLEADER_H
#include "Manger.h"
///@brief:我是小组长,只能批3天的假,500的薪水
class CTeamLeader:public CManger
{
public:
CTeamLeader(CManger* manger):CManger(manger)
{
}
virtual int ask_holiday(int days)
{
int nret = 0;
if (days <= 3)
nret = days;
else
nret = getleader()->ask_holiday(days);
return nret;
}
virtual int ask_raise(int val)
{
int nval = 0;
if (val<=500)
nval = val;
else
nval = getleader()->ask_raise(val);
return nval;
}
};
#endif
//部门领导实现
#ifndef __PARTLEADER_H
#define __PARTLEADER_H
#include "Manger.h"
///@brief:我是部门领导,只能批5天的假,1500的薪水
/// 上级是老板
class CPartLeader:public CManger
{
public:
CPartLeader(CManger* manger):CManger(manger)
{
}
virtual int ask_holiday(int days)
{
int nret = 0;
if (days <= 5)
nret = days;
else
nret = getleader()->ask_holiday(days);
return nret;
}
virtual int ask_raise(int val)
{
int nret;
if (val < 1000)
nret = val;
else if (val>=1000 && val<=1500)
nret = 1000;
else
nret = getleader()->ask_raise(val);
return nret;
}
};
#endif
//大BOSS
#ifndef __BOSS_H
#define __BOSS_H
#include "Manger.h"
///@breif:我是老板,最多请10天假,最多涨薪2000
/// 我没有上级
class CBoss:public CManger
{
public:
CBoss(CManger* manger):CManger(NULL)
{
}
virtual int ask_holiday(int days)
{
int nret = 10;
if (days < 10)
nret = days;
return nret;
}
virtual int ask_raise(int val)
{
int nret = 2000;
if (val<2000)
nret = val;
else
return nret;
}
};
#endif
//client调用实现
#include <iostream>
#include "Manger.h"
#include "PartLeader.h"
#include "Boss.h"
#include "TeamLeader.h"
int main(void)
{
CManger* boss = new CBoss(NULL);
CManger* pl = new CPartLeader(boss);
CManger* tl = new CTeamLeader(pl);
std::cout<<"ask for 3 days:"<<tl->ask_holiday(3)<<std::endl;
std::cout<<"ask for 5 days:"<<tl->ask_holiday(5)<<std::endl;
std::cout<<"ask for 10 days:"<<tl->ask_holiday(10)<<std::endl;
std::cout<<"ask for 15 days:"<<tl->ask_holiday(15)<<std::endl;
std::cout<<"ask raise 300"<<tl->ask_raise(300)<<std::endl;
std::cout<<"ask raise 800"<<tl->ask_raise(800)<<std::endl;
std::cout<<"ask raise 1300"<<tl->ask_raise(1300)<<std::endl;
std::cout<<"ask raise 2300"<<tl->ask_raise(2300)<<std::endl;
return 0;
}