设计模式-责任链模式

责任链模式使多个对象都有机会去处理请求,从而避免接收者和发送者之间的耦合关系,将这个对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理他为止。
责任链上的对像只要满足处理条件都可以对请求进行处理,如果不满足,则将此请求传递给链上的下一个对像。
在这里插入图片描述

Handler: 责任链基类,定义具体接口。
ConcreteHandlerOne: 责任链上的一个具体对象,可以处理请求,也可以把请求传递给下一个对象。
ConcreteHandlerTwo: 责任链上的一个另一个具体对象,可以处理请求,也可以把请求传递给下一个对象。
代码示例

class Handler
{
protected:
    weak_ptr<Handler> m_nexthandler;
public:
    virtual ~Handler(){};
    virtual void HandlRequest(int nrequest) = 0;
	virtual void SetNextHandler(shared_ptr<Handler> phandler) = 0;
	virtual weak_ptr<Handler> GetNextHanlder() = 0;
};

class ConcreteHandlerOne : public Handler
{
    private:
	    weak_ptr<Handler> m_nexthandler;
    public:
	   void HandlRequest(int nrequest)
	   {
	       if(nrequest> 10)
		   {
		        std::cout<<"ConcreteHandlerOne deal this requestion:"<<nrequest<<std::endl;
		   }
		   if(!m_nexthandler.expired())
		   {
		        std::cout<<"ConcreteHandlerOne cannot deal this requestion, pass the Next!!"<<std::endl;
				m_nexthandler.lock()->HandlRequest(nrequest);
		   }
	   }
	   void SetNextHandler(shared_ptr<Handler> phandler)
       {
	       this->m_nexthandler = phandler;
	   }
	   weak_ptr<Handler> GetNextHanlder()
	   {
	       return m_nexthandler;
	   }
};

class ConcreteHandlerTwo : public Handler
{
    private:
	    weak_ptr<Handler> m_nexthandler;
    public:
	   void HandlRequest(int nrequest)
	   {
	       if(nrequest> 20)
		   {
		        std::cout<<"ConcreteHandlerTwo deal this requestion:"<<nrequest<<std::endl;
		   }
		   if(!m_nexthandler.expired())
		   {
		        std::cout<<"ConcreteHandlerTwo cannot deal this requestion, pass the Next!!"<<std::endl;
				m_nexthandler.lock()->HandlRequest(nrequest);
		   }
	   }
	   void SetNextHandler(shared_ptr<Handler> phandler)
       {
	       this->m_nexthandler = phandler;
	   }
	   weak_ptr<Handler> GetNextHanlder()
	   {
	       return m_nexthandler;
	   }
};

测试代码

int main()
{
    shared_ptr<Handler> phandlerOne = make_shared<ConcreteHandlerOne>();
	shared_ptr<Handler> phandlerTwo = make_shared<ConcreteHandlerTwo>();
	//设置下一个处理对象节点
	phandlerOne.get()->SetNextHandler(phandlerTwo);
	
	phandlerOne->HandlRequest(10);
	phandlerOne->HandlRequest(25);
	phandlerTwo->HandlRequest(100);
	
	return 0;
}

责任链模式不能保证求请求一定被接收,其中一格对象没有后继对象会造成循环调用。责任链一般会与建造者或者策略模式结合,通过设定一定的条件的处理相应的请求。责任链是很灵活的,根据需要也可以写成有前继对象的情况。不过要注意防止循环调用。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值