设计模式的理解: 职责链模式 (Chain of Responsibility)

       职责链模式(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 处理了点击请求
    //-------------------------
}

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值