职责链模式(Chain of Responsibility Pattern),为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为型模式。在这种模式中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。
简言之,当有一个请求发送时,有一群对象可以按照优先级接受这些请求。职责链模式就是通过链表的形式完成下面操作,在现在来看这种实现方法有点落后,但是放在1994年还是很有指导意义的。
在图形界面程序中有些控件可以触发单机事件,例如
一个Winform 窗体上放了一个 控件组GroupBox ,控件组上放了一个Label 标签控件。我们设置 Label 标签 和 GroupBox 控件组没有单击不发生作用,当单击Label时,单击请求自上而下的传递到Winform中触发Winform 窗体的单击事件:
class Requset{
private:
string msg_;
public:
Requset(){msg_ ="点击请求";}
string getMsg(){return msg_;};
}
/****这个类时重点****/
class ChainHandler{
ChainHandler * nextHandler;
void sendRequestToNextHandler (const Requset & rq){
if(nextHandler !=nullptr){
nextHandler->handle(rq);
}
}
protected:
virtual bool canHandleRequest() = 0;
virtual void handleProcess(const Requset & rq)=0;
public:
ChainHandler(){nextHandler =nullptr;}
void setNextHandler(ChainHandler * next){nextHandler=next;}
void handle(const Requset & rq){
if(canHandleRequest()){
handleProcess(rq);
}else{
sendRequestToNextHandler(rq);
}
}
}
/**********接下来的类只要负责实现canHandleRequest和handleProcess就行************/
class Winform :public ChainHandler{
public:
void handleProcess(const Requset & rq){
cout<<"Winform 处理了"<<rq.getMsg();
}
bool canHandleRequest(){return true;}
}
class GroupBox :public ChainHandler{
public:
void handleProcess(const Requset & rq){}
bool canHandleRequest(){return false;}
}
class Label :public ChainHandler{
void handleProcess(const Requset & rq){ cout<<"Label 传递了"<<rq.getMsg();}
public:
bool canHandleRequest(){return false;}
void handle(const Requset & rq){
handleProcess(rq);
sendRequestToNextHandler(rq);
}
}
ChainHandler 类是重点,用户调用handle 函数实现 “当自己不能处理,就传递到下一个关联控件“的需求 。当然也可以重写handle 实现“当自己处理完后,也传递到下一个关联控件“,只需要把if逻辑删除就行
void main(){
Label label;
GroupBox groupbox;
Winform winform ;
Request rq;
label.setNextHandler(&groupbox);
groupbox.setNextHandler(&winform);
//---------------------
groupbox.handle(rq);
//输出 Winform 处理了点击请求
//-------------------------
label.handel(rq);
//输出 Label 传递了点击请求 Winform 处理了点击请求
//-------------------------
}