责任链模式(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;
}