首页 > 编程 > .NET > 正文

谈.net 中的职责链模式的使用_.Net教程

2024-07-10 12:51:23
字体:
来源:转载
供稿:网友

推荐:谈web中缓存的使用
很多人都知道什么叫缓存,甚至学习过,但用起来还真难用。我经过几天的学习cache想跟大家分享和讨论。 我是带着疑问去学习的。缓存是用在什么地方,有什么好处。 缓存就是把获取的数据暂时存到缓存中,当获取的数据没有变化时就还是用缓存里的东西。可能有人

职责链模式使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对明处理它为止。

职责链模式的结果如下图:

.

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判断.这对于程序的维护来说是相当麻烦的.如果我们使用职责链模式的话就可以相当简单了.

先说说我们的设计思想.

我们可以采用职责链完成所得税的计算,由职责链上的一个对象负责计算某一段的所得税.如果符合计算条件,则计算;否则由下一个对象计算.这里我们把核心的代码写出来。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace CompTax
{
    public class CompTax
    {
        private double Taxp;
        private double Minincome;
        private static double Disc=2000;
        private CompTax NextCompTax;
        public CompTax(double Minincome, double Taxp)
        {
            this.Minincome = Minincome;
            this.Taxp = Taxp;
            NextCompTax = null;
        }
        public double Comp(double income)
        {

            if(income > Minincome && (NextCompTax==null|| income< NextCompTax.Minincome))
            {
                return (income - Disc) * Taxp;
            }
            else
            {
                return NextCompTax.Comp(income);
            }
        }

        public static CompTax GetInstance()
        {
            CompTax[] cp ={
                             new CompTax(2000,0.05),
                             new CompTax(2500,0.1),
                             new CompTax(4000,0.15),
                             new CompTax(7000,0.2),
                             new CompTax(22000,0.25),
                             new CompTax(42000,0.3),
                             new CompTax(62000,0.35),
                             new CompTax(82000,0.4),
                             new CompTax(102000,0.45)
                         };
            CompTax ct=null;
            for (int i = 0; i < cp.Length-1; i++)
            {
                if (i == 0)
                    ct = cp[i];
                cp[i].NextCompTax = cp[i + 1];
            }
            return ct;
        }
    }
}

然后在页面上去调用.

        private void button1_Click(object sender, EventArgs e)
        {
            textBox2.Text = CompTax.GetInstance().Comp(double.Parse(textBox1.Text)).ToString();
        }
这样我们在GetInstance静态方法中把处理各种的可能连接了起来.如果第一个对象不能满足就用下一个对象来处理.一直直到能到处理为止.

在这里我们可以把cp这个数组从配置文件中读取,这样就实现了动态配置.说到这个我们还有很多地方可以用到这样的设计模式.比如我们会员积分功能的时候,当积分到了多少就可以做什么事等等也可以用职责链轻松解决了.


 

分享:关于IronPython和C#执行速度对比
其实我自己对执行速度这个问题本来并没有什么兴趣,因为以前的经验告诉我:除非是运算密集型的程序,否则脚本语言和编译型语言使用起来速度没有多大差别。但是我们公司有个人知道我的想法以后,天天在我耳边嚷嚷脚本运行速度太慢,那好吧,让我用实验来说服

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表