热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

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

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

职责链模式的结果如下图

.

 

 

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 >&#61; Minincome && (NextCompTax&#61;&#61;null|| income< NextCompTax.Minincome))
            
{
                
return (income - Disc) * Taxp;
            }

            
else
            
{
                
return NextCompTax.Comp(income);
            }

        }


        
public static CompTax GetInstance()
        
{
            CompTax[] cp 
&#61;{
                             new CompTax(0,0),
                             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
&#61;null;
            
for (int i &#61; 0; i < cp.Length-1; i&#43;&#43;)
            
{
                
if (i &#61;&#61; 0)
                    ct 
&#61; cp[i];
                cp[i].NextCompTax 
&#61; cp[i &#43; 1];
            }

            
return ct;
        }

    }

}

 

 

然后在页面上去调用.

 

        private void button1_Click(object sender, EventArgs e)
        {
            textBox2.Text 
&#61; CompTax.GetInstance().Comp(double.Parse(textBox1.Text)).ToString();
        }

 

 

这样我们在GetInstance静态方法中把处理各种的可能连接了起来.如果第一个对象不能满足就用下一个对象来处理.一直直到能到处理为止.

在这里我们可以把cp这个数组从配置文件中读取,这样就实现了动态配置.

 

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

 

转:https://www.cnblogs.com/jundiy/archive/2009/06/25/1511304.html



推荐阅读
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • 本文介绍了Java中Currency类的getInstance()方法,该方法用于检索给定货币代码的该货币的实例。文章详细解释了方法的语法、参数、返回值和异常,并提供了一个示例程序来说明该方法的工作原理。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
author-avatar
常州秆时尚女人帮
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有