C++ 责任链模式(Chain of Resposibility)

简介

责任链模式是一种对象的行为模式。在责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求,这使得系统可以在不影响客户端的情况下动态地重新组织和分配责任。

优点

降低耦合度,将请求的发送者和接收者解耦。
简化了对象,使得对象不需要知道链的结构。
增加新的具体处理者很方便,无须修改原有代码,只需要在客户端重新建链即可。

缺点

性能问题,每个请求都从头到尾遍历。
如果建链不当,可能会造成循环调用,这将导致系统陷入死循环

使用场景

在代码开发过程中,如果发现自己正在写很长的if-else代码或很长的switch-case代码时,不妨应用一下责任链模式。

代码如下:


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

//抽象处理者
class handler
{
public:
    handler() { m_next_handler = NULL; }
    virtual ~handler() {}

    //设置下一个处理者
    void set_next(handler *successor) { m_next_handler = successor; }

    //处理请求
    virtual void handle_requ(int money) = 0;
protected:
    handler *m_next_handler;
};


//具体处理者、主管
class Director :public handler
{
public:
    //处理请求
    virtual void handle_requ(int money)
    {
        if (money <= 200)
        {
            cout << "我是主管,最高可批准200块经费!批准!" << endl; 
        }
        else
        {
            m_next_handler->handle_requ(money);
        }
    }
};

//具体处理者、经理
class Manager :public handler
{
public:
    //处理请求
    virtual void handle_requ(int money)
    {
        if (money <= 400)
        {
            cout << "我是经理,最高可批准400块经费!批准!" << endl;
        }
        else
        {
            m_next_handler->handle_requ(money);
        }
    }
};

//具体处理者、老板
class Boss :public handler
{
public:
    //处理请求
    virtual void handle_requ(int money)
    {
        if (money <= 800)
        {
            cout << "我是老板,最高可批准800块经费!批准!" << endl;
        }
        else
        {
            cout << "你申请的经费太多,无法批准!" << endl;
        }
    }
};
///
int main()
{
	std::cout << "start-up .." << std::endl;
    handler *director = new Director;
    handler *manager = new Manager;
    handler *boss = new Boss;

    //设置责任链
    director->set_next(manager);
    manager->set_next(boss);


    director->handle_requ(100);
    director->handle_requ(200);
    director->handle_requ(300);
    director->handle_requ(800);
	director->handle_requ(1000);

	
	std::cout << "done .." << std::endl;
    return 0;
}


运行如下:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值