zoukankan      html  css  js  c++  java
  • 设计模式-职责链模式

    责任链模式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;
    }
    
    运行结果:


    总结:
        和状态模式相比,它的条件可以相关,也可以所有都不相关;与组合模式相比,组合模式是有树形结构的,也就是是有等级关系的,而职责链模式则是一条线,没有什么结构。
  • 相关阅读:
    【codecombat】 试玩全攻略 第二章 边远地区的森林 一步错
    【codecombat】 试玩全攻略 第十八关 最后的kithman族
    【codecombat】 试玩全攻略 第二章 边远地区的森林 woodlang cubbies
    【codecombat】 试玩全攻略 第二章 边远地区的森林 羊肠小道
    【codecombat】 试玩全攻略 第十七关 混乱的梦境
    【codecombat】 试玩全攻略 第二章 边远地区的森林 林中的死亡回避
    【codecombat】 试玩全攻略 特别关:kithguard斗殴
    【codecombat】 试玩全攻略 第二章 边远地区的森林 森林保卫战
    【codecombat】 试玩全攻略 第二章 边远地区的森林
    实验3 类和对象||
  • 原文地址:https://www.cnblogs.com/csnd/p/12062324.html
Copyright © 2011-2022 走看看