• 设计模式-职责链模式


    责任链模式Chain of Responsibility):

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


    责任链模式的好处:

          当客户提交一个请求的时,请求是沿链传递直至有一个ConcreteHandler对象负责处理它。

    接收者和发送者都没有对方的明确信息,且链中的对象自己也并不知道链的结构。

          结果是职责链可简化对象的相互连接,它们仅需要保持一个指向其后继者的引用,而不需要保持它所有的后选择接收者的引用。

        可以随时地增加或者修改一个请求的结构。

        增强了给对象指派职责的灵活性。

        一个请求极有可能到了链的末端都得不到处理,或者因为没有正确配置而得不到处理。

    职责链代码:

    #pragma once
    #include <iostream>
    using namespace std;
    
    //Handler类,定义一个处理请求的接口
    class CHandler
    {
    protected:
    	CHandler *m_pSuccessor;
    public:
    	CHandler(){m_pSuccessor = NULL;}
    	void SetSuccessor(CHandler *pSuccessor)
    	{
    		m_pSuccessor = pSuccessor;
    	}
    	virtual void HandleRequest(const int &nRequest) = 0;
    };
    
    //ConcreteHandler类,具体处理者类,处理它所负责的请求,可访问它的后继者,
    //如果可处理该请求,就处理之,否则就将该请求转发给它的后继者。
    //ConcreteHandler1,当请求数在0到10之间则有权利处理,否则转到下一位。
    class CConcreteHandler1 : public CHandler
    {
    public:
    	void HandleRequest(const int &nRequest)
    	{
    		if(nRequest >= 0 && nRequest < 10)
    		{
    			cout<<"CConcreteHandler1:"<<nRequest<<endl;
    		}
    		else if(m_pSuccessor != NULL)
    		{
    			m_pSuccessor->HandleRequest(nRequest);
    		}
    	}
    };
    
    //ConcreteHandler2,10-20。
    class CConcreteHandler2 : public CHandler
    {
    public:
    	void HandleRequest(const int &nRequest)
    	{
    		if(nRequest >= 10 && nRequest < 20)
    		{
    			cout<<"CConcreteHandler2:"<<nRequest<<endl;
    		}
    		else if(m_pSuccessor != NULL)
    		{
    			m_pSuccessor->HandleRequest(nRequest);
    		}
    	}
    };
    
    
    客户端使用代码:

    #include "stdafx.h"
    #include <iostream>
    #include <windows.h>
    #include "ChainOfResponsibilityMode.h"
    using namespace std;
    
    int main()
    {
    	CHandler *pH1 = new CConcreteHandler1();
    	CHandler *pH2 = new CConcreteHandler2();
    	pH1->SetSuccessor(pH2);
    	for(int i = 5 ;i <= 15 ;i ++)
    	{
    		pH1->HandleRequest(i);
    	}
    	delete pH1;
    	delete pH2;
    	return 0;
    }
    
    运行结果:


    总结:
        和状态模式相比,它的条件可以相关,也可以所有都不相关;与组合模式相比,组合模式是有树形结构的,也就是是有等级关系的,而职责链模式则是一条线,没有什么结构。
  • 相关阅读:
    各种 SDk
    面试第一周
    KVC/KVO 的概述和使用
    How Many Tables HDU
    The Suspects POJ
    Wireless Network POJ
    Layout POJ
    The Shortest Path in Nya Graph HDU
    Extended Traffic LightOJ
    Tram POJ
  • 原文地址:https://www.cnblogs.com/csnd/p/12062323.html
Copyright © 2020-2023  润新知