职责链模式使多个对象都有机会处理请求从而避免请求的发送者和接收者之间的耦合关系将这些对象连成一条链并沿着这条链传递该请求直到有一个对明处理它为止
职责链模式的结果如下图
Handler:定义一个处理请求的接口并实现后继链
ConcreteHandler:处理负责的请求并可访问后继者如果可处理该请求则处理之否则将该请求转发给后继者
Client:向链上的具体处理者对象提交请求
在这里先用一个简单的例子计算所得税来说明一下职责链模式在应用中的作用
先简要的说一下计算所得税的方法:
以成都为例:
计算金额应纳税额个税率
元/月以内免税
元/月以上至元/月不超过元%
元/月以上至元/月元至元%
元/月以上至元/月元至元%
元/月以上至元/月元至元%
元/月以上至元/月元至元%
元/月以上至元/月元至元%
元/月以上至元/月元至元%
元/月以上至元/月元至元%
元/月以上元以上%
(工资)*相应工资范围的个税率
当你看到这样的一个计算方式之后你心里是不是已经有了自己的想法了?写一系列的if语句来一条条的判断但这样的写法虽然可以实现目前的需求可如果当税率发生了变化你又得拿出你的程序一步一步的修改如果if语句的条数发生变化的话我们还必须在代码中添加必要的if判断这对于程序的维护来说是相当麻烦的如果我们使用职责链模式的话就可以相当简单了
先说说我们的设计思想
我们可以采用职责链完成所得税的计算由职责链上的一个对象负责计算某一段的所得税如果符合计算条件则计算;否则由下一个对象计算这里我们把核心的代码写出来
using System;
using SystemCollectionsGeneric;
using SystemLinq;
using SystemText;
namespace CompTax
{
public class CompTax
{
private double Taxp;
private double Minincome;
private static double Disc=;
private CompTax NextCompTax;
public CompTax(double Minincome double Taxp)
{
thisMinincome = Minincome;
thisTaxp = Taxp;
NextCompTax = null;
}
public double Comp(double income)
{
if(income > Minincome && (NextCompTax==null|| income< NextCompTaxMinincome))
{
return (income Disc) * Taxp;
}
else
{
return NextCompTaxComp(income);
}
}
public static CompTax GetInstance()
{
CompTax[] cp ={
new CompTax()
new CompTax()
new CompTax()
new CompTax()
new CompTax()
new CompTax()
new CompTax()
new CompTax()
new CompTax()
};
CompTax ct=null;
for (int i = ; i < cpLength; i++)
{
if (i == )
ct = cp[i];
cp[i]NextCompTax = cp[i + ];
}
return ct;
}
}
}
然后在页面上去调用
private void button_Click(object sender EventArgs e)
{
textBoxText = CompTaxGetInstance()Comp(doubleParse(textBoxText))ToString();
}
这样我们在GetInstance静态方法中把处理各种的可能连接了起来如果第一个对象不能满足就用下一个对象来处理一直直到能到处理为止
在这里我们可以把cp这个数组从配置文件中读取这样就实现了动态配置说到这个我们还有很多地方
可以用到这样的设计模式比如我们会员积分功能的时候当积分到了多少就可以做什么事等等也可以用职责链轻松解决了