职责链模式

发布时间:2022-07-04 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了职责链模式脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。

职责链模式

使多个对象都有机会处理请求,从而避免请求的发送和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递请求,直到有一个对象处理为止。

enum ReqestTyPE{
  HANDLE1,
  HANDLE2,
  HANDLE3
};

class Reqest
{
public:
  Reqest(const std::string& desc,ReqestType request_type):
  	desc_(desc),
  	request_type_(request_type)
  {
      
  }
	ReqestType getReqestType() const
  {
    return request_type_;
  }
  const std::string& getDesc() const
  {
    return desc_;
  }
  
PRivate:
  std::string desc_;
  ReqestType request_type_;
}

class ChainHandler
{
public:
  ChainHandler():
  	next_chain_hander_(nullptr)
  {
    
	}
  void setNextChain(ChainHandler* next_chain_hander)
  {
    next_chain_hander_=next_chain_hander
  }
  void handle(const Reqest& reqest)
  {
    if(canHandleRequest(reqest))
      processRequest(reqest)
    else
      sendReqestToNextHandler(reqest)
  }
  
protected:
  virtual bool canHandleRequest(const Reqest& reqest) = 0;
  virtual void processRequest(const Reqest& reqest) = 0;
  
private:
  void sendReqestToNextHandler(const Reqest& reqest)
  {
    if(next_chain_hander_)
      next_chain_hander->handle(reqest);
  }
  
  ChainHandler* next_chain_hander_;
};

class Handler1 : public ChainHandler
{
  virtual bool canHandleRequest(const Reqest& reqest) override
  {
    return reqest.getReqestType()==ReqestType::HANDLE1;
  }
  virtual void processRequest(const Reqest& reqest) override
  {
    std::cout<<"Handler1:"<<reqest.getDesc()<<std::endl;
  }
}

class Handler2 : public ChainHandler
{
  virtual bool canHandleRequest(const Reqest& reqest) override
  {
    return reqest.getReqestType()==ReqestType::HANDLE2;
  }
  virtual void processRequest(const Reqest& reqest) override
  {
    std::cout<<"Handler2:"<<reqest.getDesc()<<std::endl;
  }
}

class Handler3 : public ChainHandler
{
  virtual bool canHandleRequest(const Reqest& reqest) override
  {
    return reqest.getReqestType()==ReqestType::HANDLE3;
  }
  virtual void processRequest(const Reqest& reqest) override
  {
    std::cout<<"Handler3:"<<reqest.getDesc()<<std::endl;
  }
}

int main()
{
  Handler1 h1;
  Handler2 h2;
  Handler3 h3;
  h1.setNextChain(&h2);
  h2.setNextChain(&h3);
  
  Reqest reqest("task",ReqestType::HANDLE3);
  h1.handle(reqest);
  return 0;
}

UML类图

职责链模式

脚本宝典总结

以上是脚本宝典为你收集整理的职责链模式全部内容,希望文章能够帮你解决职责链模式所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。