设计模式 - 责任链模式

责任链模式(Chain ofresponsibility Pattern)

基本概念:

责任链,顾名思义,是指一个负责相应请求的行为链。

首先要理解的是一个链,然后通过这个链来管理个行为。

什么时候会用到责任链:

对于一个请求,没有特别指明由谁处理或没有指明如何处理。此时可以使用责任链的形式,用过将各种处理行为设置成为一个链条形式,将请求逐级传送。如果遇到合适的处理方式就处理该请求,并停止传输,如果没有符合对当前请求进行处理的方式,就继续想下一个链节点传送。

举个栗子:

当前一条汽车零部件传送带,在传送带的沿线有A、B、C三个汽车组装点。由于组装进度不同,同一时刻,不同的组装点可能需要不同的汽车零部件。零部件随机的从传送带源头开始传送,传送到某一组装点,如果该组装点需求该部件,则拿走该部件。如果不需要,则不动该部件,是之继续往前传送给下一个组装点。假设传送带上的零部件总是会被三个组装点中的一个取走。

上代码:

//虚基类

//H文件

#pragma once

#include <iostream>

#include <assert.h>

#include <string>

 

using namespace std;

 

class vComponent

{

public:

 

   vComponent(void);

   ~vComponent(void);

   void setNextComponent(vComponent*next);

   vComponent* nextComponent;

   int componentNum;

 

   virtual void getComponent(intnum) = 0;

   virtual void show() = 0;

};

//CPP文件

#include "vComponent.h"

 

vComponent::vComponent(void)

{

   nextComponent = NULL;

   componentNum = 0;

}

 

vComponent::~vComponent(void)

{

   if(nextComponent != NULL)

      delete nextComponent;

}

 

void vComponent::setNextComponent(vComponent* next)

{

   if(next != NULL)

      nextComponent = next;

}

 

//具体的类

//H文件

#pragma once

#include "vcomponent.h"

class aComponent : public vComponent

{

public:

   aComponent(void);

   ~aComponent(void);

 

   void getComponent(int num);

   void show();

};

 

class bComponent : public vComponent

{

public:

   bComponent(void);

   ~bComponent(void);

 

   void getComponent(int num);

   void show();

};

 

class cComponent : public vComponent

{

public:

   cComponent(void);

   ~cComponent(void);

 

   void getComponent(int num);

   void show();

};

//CPP文件

#include "specificComponent.h"

 

//aComponent

aComponent::aComponent(void)

{

   componentNum = 1;

}

 

aComponent::~aComponent(void)

{

}

 

void aComponent::getComponent(int num)

{

   if(num == componentNum)

      cout<<"aComponentneeded"<<endl;

   else if(nextComponent!=NULL)

      nextComponent->getComponent(num);

 

}

 

void aComponent::show()

{

   cout<<"aComponent"<<endl;

}

 

//bComponent

bComponent::bComponent(void)

{

   componentNum = 2;

}

 

bComponent::~bComponent(void)

{

}

 

void bComponent::getComponent(int num)

{

   if(num == componentNum)

      cout<<"bComponentneeded"<<endl;

   else if(nextComponent!=NULL)

      nextComponent->getComponent(num);

 

}

 

void bComponent::show()

{

   cout<<"bComponent"<<endl;

}

 

 

//cComponent

cComponent::cComponent(void)

{

   componentNum = 3;

}

 

 

cComponent::~cComponent(void)

{

}

 

void cComponent::getComponent(int num)

{

   if(num == componentNum)

      cout<<"cComponentneeded"<<endl;

   else if(nextComponent!=NULL)

      nextComponent->getComponent(num);

 

}

void cComponent::show()

{

   cout<<"cComponent"<<endl;

}

//测试

//#include "vld.h"

#include "vComponent.h"

#include "specificComponent.h"

 

vComponent* iniChain();

 

int main()

{

   vComponent* Compoent = iniChain();

   Compoent->show();

   Compoent->nextComponent->show();

   Compoent->nextComponent->nextComponent->show();

 

   Compoent->getComponent(1);

   Compoent->getComponent(2);

   Compoent->getComponent(3);

 

   delete Compoent;

 

   return 0;

  

}

 

vComponent* iniChain()//可以返回局部指针

{

   aComponent* aCom = new aComponent();

   bComponent* bCom = new bComponent();

   cComponent* cCom = new cComponent();

 

   aCom->setNextComponent(bCom);

   bCom->setNextComponent(cCom);

   cCom->setNextComponent(NULL);

   return aCom;

}

猜你喜欢

转载自blog.csdn.net/tecsai/article/details/78318801