本篇文章浅谈.NET中的职责链模式的使用。职责链模式使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。
责任链形式使多个目标都有时机处理恳求,然后防止恳求的发送者和接收者之间的耦合联系.将这些目标连成一条链,并沿着这条链传递该恳求,直到有一个对明处理它停止.
责任链形式的成果如下图
Handler:界说一个处理恳求的接口并完结后继链.
ConcreteHandler:处理担任的恳求并可拜访后继者.假如可处理该恳求,则处理之,不然将该恳求转发给后继者.
Client:向链上的详细处理者目标提交恳求.
在这儿先用一个简略的比方核算所得税来阐明一下责任链形式在运用中的效果
先扼要的说一下核算所得税的办法:
以成都为例:
核算金额----------------------应纳税额---------个税率
1、2000元/月以内免税;
2、2000元/月以上至2500元/月----不超越500元----5%
3、2500元/月以上至4000元/月----500元至2000元----10%
4、4000元/月以上至7000元/月----2000元至5000元----15%
5、7000元/月以上至22000元/月----5000元至20000元----20%
6、22000元/月以上至42000元/月----20000元至40000元----25%
7、42000元/月以上至62000元/月----40000元至60000元----30%
8、62000元/月以上至82000元/月----60000元至80000元----35%
9、82000元/月以上至102000元/月----80000元至100000元----40%
10、102000元/月以上----100000元以上----45%
(薪酬-2000)*相应薪酬规模的个税率
当你看到这样的一个核算办法之后你心里是不是已经有了自己的主意了?写一系列的if句子来一条条的判别.但这样的写法尽管能够完结现在的需求,可假如当税率发生了改变你又得拿出你的程序一步一步的修正.假如if句子的条数发生改变的话咱们还必须在代码中增加必要的if判别.这关于程序的保护来说是适当费事的.假如咱们运用责任链形式的话就能够适当简略了.
先说说咱们的规划思维.
咱们能够选用责任链完结所得税的核算,由责任链上的一个目标担任核算某一段的所得税.假如契合核算条件,则核算;不然由下一个目标核算.这儿咱们把中心的代码写出来
- usingSystem;
- usingSystem.Collections.Generic;
- usingSystem.Linq;
- usingSystem.Text;
- namespaceCompTax
- {
- publicclassCompTax
- {
- privatedoubleTaxp;
- privatedoubleMinincome;
- privatestaticdoubleDisc=2000;
- privateCompTaxNextCompTax;
- publicCompTax(doubleMinincome,doubleTaxp)
- {
- this.Minincome=Minincome;
- this.Taxp=Taxp;
- NextCompTax=null;
- }
- publicdoubleComp(doubleincome)
- {
- if(income>Minincome&&(NextCompTax==null||income<NextCompTax.Minincome))
- {
- return(income-Disc)*Taxp;
- }
- else
- {
- returnNextCompTax.Comp(income);
- }
- }
- publicstaticCompTaxGetInstance()
- {
- CompTax[]cp={
- newCompTax(2000,0.05),
- newCompTax(2500,0.1),
- newCompTax(4000,0.15),
- newCompTax(7000,0.2),
- newCompTax(22000,0.25),
- newCompTax(42000,0.3),
- newCompTax(62000,0.35),
- newCompTax(82000,0.4),
- newCompTax(102000,0.45)
- };
- CompTaxct=null;
- for(inti=0;i<cp.Length-1;i++)
- {
- if(i==0)
- ct=cp[i];
- cp[i].NextCompTax=cp[i+1];
- }
- returnct;
- }
- }
- }
然后在页面上去调用.
- privatevoidbutton1_Click(objectsender,EventArgse)
- {
- textBox2.Text=CompTax.GetInstance().Comp(double.Parse(textBox1.Text)).ToString();
- }
这样咱们在GetInstance静态办法中把处理各种的或许连接了起来.假如***个目标不能满意就用下一个目标来处理.一向直到能到处理停止.
在这儿咱们能够把cp这个数组从装备文件中读取,这样就完结了动态装备.
提到这个咱们还有许多当地能够用到这样的规划形式.比方咱们会员积分功用的时分,当积分到了多少就能够做什么事等等也能够用责任链轻松处理了.
【修改引荐】
- 浅谈C#泛型的用途
- .Net渠道开源项目五年开展回忆
- .Net渠道下的分布式缓存规划
- .NET渠道上Web开发的未来?
- 微软.NET渠道中类型运用的基本原理
知优网 » 浅谈.NET中的责任链形式的运用(netty责任链模式)