责任链模式


抽象处理者(Handler)角色:定义出一个处理请求的接口。如果需要,接口可以定义出一个方法,以设定和返回对下家的引用。这个角色通常由一个抽象类或接口实现。

具体处理者(ConcreteHandler)角色:具体处理者接到请求后,可以选择将请求处理掉,或者将请求传给下家。由于具体处理者持有对下家的引用,因此,如果需要,具体处理者可以访问下家。

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

// 请求
class Request
{
public:
    int m_nNumber;
};

// 管理者
class Manager
{
public:
    Manager(string temp) { name = temp; }
    void SetSuccessor(Manager* temp) { manager = temp; }
    virtual void GetRequest(Request* request) = 0;
protected:
    Manager* manager;
    string name;
};

// 经理
class CommonManager : public Manager
{
public:
    CommonManager(string strTemp) : Manager(strTemp) {}
    virtual void GetRequest(Request* request);
};

void CommonManager::GetRequest(Request* request)
{
    if (request->m_nNumber>=0 && request->m_nNumber<1000)
    {
         cout << name << " 处理了请求: " << request->m_nNumber << endl;
    }
    else
     {
         manager->GetRequest(request);
     }
}

// 总监
class Majordomo : public Manager
{
public:
    Majordomo(string strTemp) : Manager(strTemp) {}
    virtual void GetRequest(Request* request);
};

void Majordomo::GetRequest(Request* request)
{
     if (request->m_nNumber <= 5000)
     {
        cout << name << " 处理了请求: " << request->m_nNumber << endl;
     }
     else
    {
         manager->GetRequest(request);
    }
}
//总经理     
class GeneralManager: public Manager    
{    
public:    
    GeneralManager(string name):Manager(name) {}    
    virtual void GetRequest(Request* request)  //总经理可以处理所有请求     
    {         
        cout << name << " 处理了请求: " << request->m_nNumber << endl;          
    }    
};  


int main()
{
     Manager* common = new CommonManager("张经理");
     Manager* major = new Majordomo("李总监");
     GeneralManager* general  = new GeneralManager("赵总");
     common->SetSuccessor(major);
     major->SetSuccessor(general);
     Request* rq = new Request();

    rq->m_nNumber = 999;
    common->GetRequest(rq);
    
    rq->m_nNumber = 4999;
    common->GetRequest(rq);

     rq->m_nNumber = 6999;
     common->GetRequest(rq);

     delete rq;
     delete major;
     delete common;
     delete general;
     return 0;
}

要点与实现:

1.要注意的是:一个请求到链的最后可能也没有处理,所以一定要配置得当.

2.责任链模式并不创建责任链。责任链的创建必须由系统的其它部分创建出来。

3.责任链模式降低了请求的发送端和接收端之间的耦合,使多个对象都有机会处理这个请求。一个链可以是一条线,一个树,也可以是一个环。如下图所示,责任链是一个树结构的一部分。

优质内容筛选与推荐>>
1、装win7后导致原来Ubuntu无法启动的问题解决方案
2、测试第一博
3、图书封面制作-ps图片处理使用教程
4、Enumeration遍历http请求参数的一个例子
5、eclipse默认编码设置为utf-8


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号