常常在一些组件内部会有特定数据结构,如果客户代码直接使用这些特定数据结构,会极大破坏组件复用;因此,可以将组件中主句结构封装在内部,为外部提供统一的接口,来实现与特定数据结构无关的访问。
composite,iterator,chain of responsibility属于数据结构模式。
motivation:一个请求可能会被多个对象处理,但是每个请求只能有一个接收者;如果显示指定,一定会给发送者和接收者带来紧耦合;将这些接收者对象连城一条链,沿着这条链进行传递请求,直到有一个对象处理该请求为止。
key interface or class:
1. Handler接口。
feature: 。
structure:
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.如果请求在最后都没有得到处理,则应该规定缺省操作;这应该在处理者中完成,而不是由请求发出者来规定。