Chapter24 职责链模式

职责链模式简介

职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。

此模式的关键点在于,当客户提交一个请求时,请求是沿着链传递直至有一个ConcreteHandler对象负责处理它。这就使得接收者和发送者都没有对方的明确信息,且链中的对象自己也并不知道链的结构。结果是职责链可简化对象的相互联系,它们仅需保持一个指向其后继者的引用,而不需要保持它所有的候选接收者的引用。如此大大减低了耦合度。

此模式是由客户端来定义链的结构,客户可随时地增加或修改处理一个请求的结构,增强了对象指派职责的灵活性。

需要注意不能出现,一个请求到达链的末端还未得到处理,或者因为没有正确配置而没有得到处理。

职责链模式UML类图

 

 

C++代码实现

// Handler抽象类,用于定义接口
#ifndef _HANDLER_HPP
#define _HANDLER_HPP
class Handler{
public:
    virtual void setSuccessor(Handler* h) = 0;
    virtual void handleRequest(int req) = 0;

};

#endif
//ConcreteHandler1类
#ifndef _CONCRETEHANDLER1_HPP
#define _CONCRETEHANDLER1_HPP

#include"handler.hpp"
#include<iostream>
using namespace std;

class ConcreteHandler1:public Handler{
public:
    virtual void setSuccessor(Handler* h) override {
        hdl = h;
    };
    virtual void handleRequest(int req) override {
        if(0 <= req && req < 10){
            cout << "[0,10) is handled by handler1" << endl;
        }
        else{
            if(!hdl){
                cout << "no successor found in ConcreteHandler1 object, requst can't be handled." << endl;
            }
            else{
                hdl->handleRequest(req);
            }
        }
    } ;


private:
    Handler* hdl;
};
#endif
//ConcreteHandler2类
#ifndef _CONCRETEHANDLER2_HPP
#define _CONCRETEHANDLER2_HPP

#include"handler.hpp"
#include<iostream>
using namespace std;

class ConcreteHandler2:public Handler{
public:
    virtual void setSuccessor(Handler* h) override {
        hdl = h;
    };
    virtual void handleRequest(int req) override {
        if(10 <= req && req < 20){
            cout << "[10,20) is handled by handler2" << endl;
        }
        else{
            if(!hdl){
                cout << "no successor found in ConcreteHandler2 object, requst can't be handled." << endl;
            }
            else{
                hdl->handleRequest(req);
            }
        }
    } ;


private:
    Handler* hdl;
};
#endif
// ConcreteHandler3 类
#ifndef _CONCRETEHANDLER3_HPP
#define _CONCRETEHANDLER3_HPP

#include"handler.hpp"
#include<iostream>
using namespace std;

class ConcreteHandler3:public Handler{
public:
    virtual void setSuccessor(Handler* h) override {
        hdl = h;
    };
    virtual void handleRequest(int req) override {
        if(20 <= req && req < 30){
            cout << "[20,30) is handled by handler3" << endl;
        }
        else{
            if(!hdl){
                cout << "no successor found in ConcreteHandler3 object, requst can't be handled." << endl;
            }
            else{
                hdl->handleRequest(req);
            }
        }
    } ;


private:
    Handler* hdl;
};
#endif
// 客户端代码
#include<iostream>

#include"concretehandler1.hpp"
#include"concretehandler2.hpp"
#include"concretehandler3.hpp"

using namespace std;
int main(){
    ConcreteHandler1* conHdl1 =  new ConcreteHandler1();
    ConcreteHandler2* conHdl2 =  new ConcreteHandler2();
    ConcreteHandler3* conHdl3 =  new ConcreteHandler3();

    conHdl1->setSuccessor(conHdl2);
    conHdl2->setSuccessor(conHdl3);
    conHdl3->setSuccessor(nullptr);

    int req = 5;
    conHdl1->handleRequest(req);

    req = 15;
    conHdl1->handleRequest(req);

    req = 25;
    conHdl1->handleRequest(req);

    req = 35;
    conHdl1->handleRequest(req);

    getchar();
    return 0;
}

 

运行结果:

 

posted @ 2020-04-02 10:58  yangbofun  阅读(250)  评论(0)    收藏  举报