当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > 浅谈.net 中的职责链模式的使用

ASP.NET
asp.net GridView控件中模板列CheckBox全选、反选、取消
asp.net GridView 删除时弹出确认对话框(包括内容提示)
asp.net DropDownList 三级联动下拉菜单实现代码
asp DataTable添加列和行的三种方法
Asp.net 页面调用javascript变量的值
asp.net 长文章通过设定的行数分页
asp.net 定时间点执行任务的简易解决办法
asp.net 页面延时五秒,跳转到另外的页面
asp.net 动态输出透明gif图片
asp.net DataList与Repeater用法区别
asp.net Javascript获取CheckBoxList的value
asp.net程序在调式和发布之间图片路径问题的解决方法
asp.net下生成英文字符数字验证码的代码
asp.net 页面版文本框智能提示JSCode (升级版)
ASP.NET URL伪静态重写实现方法
ASP.NET 2.0 中Forms安全认证
asp.net 动态添加多个用户控件
asp.net Repeater显示父子表数据,无闪烁
asp.net 无法获取的内部内容,因为该内容不是文本 的解决方法
asp.net GridView排序简单实现

ASP.NET 中的 浅谈.net 中的职责链模式的使用


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 70 ::
收藏到网摘: n/a

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

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

.

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这个数组从配置文件中读取,这样就实现了动态配置.说到这个我们还有很多地方。

可以用到这样的设计模式.比如我们会员积分功能的时候,当积分到了多少就可以做什么事等等也可以用职责链轻松解决了。