15.职责链模式

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值