2011年(11)
分类: C/C++
2011-06-08 22:14:45
责任连模式适用于,一个请求会被一组对象中的一个或多个进行处理。就像现实生活中的自来水厂对水的处理流程。
以报销单审核为例,你们公司很少出差,一年只出一次,一次出一年。年底回到公司,你就开始填写报销单,然后提交,然后等待。等待的过程发生了什么,你是这样表达的
Bool check(报销单)
{
If(直线经理审核不通过)
{
Return false;
}
If(部门经理审核不通过)
{
Return false;
}
If(财务审核不通过)
{
Return false;
}
Return true; //乞求快速走到这一步吧。
}
考虑,要是审核顺序改变,审核流程增加或删除,你怎么应对呢?又需要修改源代码。来看看Chain Of Responsibility是怎样解决的吧。
Chain Of Responsibility的标准结构是这样的:
Handler是每个处理流程的抽象接口,这个接口有一个自身的引用代表下一个处理实例。
Class Check
{
Public:
//审核处理
Virtual bool check()=0;
//设置下一个处理对象
Void setNextCheck(Check * pNextCheck)
{
pNtChk = pNextCheck;
}
Private:
Check * pNtChk;
};
//直线经理审核
Class StraitCheck
{
Public:
Bool check()
{
If(pNtChk !=NULL&&报销事由正常)
{
//交由下一处理环节
Return pNtChk.check();
}
Else
{
Return false;
}
}
};
//部门经理审核
Class DepBossCheck
{
Public:
Bool check()
{
If(pNtChk !=NULL&&符合项目预算)
{
//交由下一处理环节
Return pNtChk.check();
}
Else
{
Return false;
}
}
};
//财务审核
Class FinaCheck
{
Public:
Bool check()
{
If(pNtChk !=NULL&&发票没问题)
{
//交由下一处理环节
Return pNtChk.check();
}
Else
{
Return false;
}
}
};
Int main()
{
//实例化三个处理流程
Check * pStraitCheck = new pStraitCheck();
Check * DepBossCheck = new DepBossCheck ();
Check * FinaCheck = new FinaCheck ();
//构造处理链
pStraitCheck-> setNextCheck(DepBossCheck);
DepBossCheck-> setNextCheck(FinaCheck);
FinaCheck-> setNextCheck(NULL);
//处理审核单
Client pClient;
pClient->setCheckChain(pStraitCheck);
pClient->getCheckChan()->check();
}
现在改变处理顺序则直接在main中修改初始化顺序,增加处理流程则对Check()接口进行新的实现。
责任链模式符合单一职责和ocp原则