天天看点

设计模式——职责链(chain of responsibility)

常常在一些组件内部会有特定数据结构,如果客户代码直接使用这些特定数据结构,会极大破坏组件复用;因此,可以将组件中主句结构封装在内部,为外部提供统一的接口,来实现与特定数据结构无关的访问。

composite,iterator,chain of responsibility属于数据结构模式。

motivation:一个请求可能会被多个对象处理,但是每个请求只能有一个接收者;如果显示指定,一定会给发送者和接收者带来紧耦合;将这些接收者对象连城一条链,沿着这条链进行传递请求,直到有一个对象处理该请求为止。

key interface or class:

        1. Handler接口。

feature: 。

structure:

设计模式——职责链(chain of responsibility)

template codes:

class Request{
    //实现具体Request类
}

//基类
class ChainHandler{
private:
    ChainHandler* nextHdlr;
    endRequestToNext(){
        if(nextHdlr != nullptr){
            nextHdlr->handle();
        }
    }

protected:
    virtual void processRequest(const Request& req)=0;
    virtual bool canProcessRequest(const Request& req)=0;
public:
    ChainHandler(){nextHdlr = nullptr;}
    void setNexthandler(ChainHandler* next){
        nextHdlr = next;
    }

    void handle(){
        if(canProcessRequest()){    
            processRequest();
        }
        else
            endRequestToNext();
    }

};


//是实现不同的handler
class Handler1{
protected:
    void processRequest(const Request& req) override{
        //实现对应的方法
    }
    boolcanProcessRequest(const Request& req) override{
        //实现对应的方法
    }
};
class Handler2{
protected:
    void processRequest(const Request& req) override{
        //实现对应的方法
    }
    boolcanProcessRequest(const Request& req) override{
        //实现对应的方法
    }
};

int main(){
    Handler1 hdlr1;
    Handler2 hdlr2;
    Handler3 hdlr3;
    hdlr1.setNexthandler(hdlr2);
    hdlr2.setNexthandler(hdlr3);

    Request req("..");
    hdlr1.handle(req);
}

           

summary:

1. chain of responsibility 适用于“请求可能有多个处理者,但是最后只有一个真正的处理者”;

2.应用chain of responsibility之后,对象的指责分派更具有灵活性;可以在运行时动态添加、修改请求的处理职责;

3.如果请求在最后都没有得到处理,则应该规定缺省操作;这应该在处理者中完成,而不是由请求发出者来规定。

继续阅读