Chinaunix首页 | 论坛 | 博客
  • 博客访问: 31194
  • 博文数量: 11
  • 博客积分: 256
  • 博客等级: 二等列兵
  • 技术积分: 110
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-15 17:02
文章存档

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原则

 

阅读(1331) | 评论(0) | 转发(0) |
0

上一篇:strategy

下一篇:VIM速查卡

给主人留下些什么吧!~~