談.net 中的職責(zé)鏈模式的使用_.Net教程
推薦:談web中緩存的使用很多人都知道什么叫緩存,甚至學(xué)習(xí)過,但用起來還真難用。我經(jīng)過幾天的學(xué)習(xí)cache想跟大家分享和討論。 我是帶著疑問去學(xué)習(xí)的。緩存是用在什么地方,有什么好處。 緩存就是把獲取的數(shù)據(jù)暫時存到緩存中,當(dāng)獲取的數(shù)據(jù)沒有變化時就還是用緩存里的東西�?赡苡腥�
職責(zé)鏈模式使多個對象都有機會處理請求,從而避免請求的發(fā)送者和接收者之間的耦合關(guān)系.將這些對象連成一條鏈,并沿著這條鏈傳遞該請求,直到有一個對明處理它為止。
職責(zé)鏈模式的結(jié)果如下圖:
.

Handler:定義一個處理請求的接口并實現(xiàn)后繼鏈.
ConcreteHandler:處理負責(zé)的請求并可訪問后繼者.如果可處理該請求,則處理之,否則將該請求轉(zhuǎn)發(fā)給后繼者.
Client:向鏈上的具體處理者對象提交請求.
在這里先用一個簡單的例子計算所得稅來說明一下職責(zé)鏈模式在應(yīng)用中的作用
先簡要的說一下計算所得稅的方法:
以成都為例:
計算金額----------------------應(yīng)納稅額---------個稅率
1、2000元/月以內(nèi)免稅;
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)*相應(yīng)工資范圍的個稅率
當(dāng)你看到這樣的一個計算方式之后你心里是不是已經(jīng)有了自己的想法了?寫一系列的if語句來一條條的判斷.但這樣的寫法雖然可以實現(xiàn)目前的需求,可如果當(dāng)稅率發(fā)生了變化你又得拿出你的程序一步一步的修改.如果if語句的條數(shù)發(fā)生變化的話我們還必須在代碼中添加必要的if判斷.這對于程序的維護來說是相當(dāng)麻煩的.如果我們使用職責(zé)鏈模式的話就可以相當(dāng)簡單了.
先說說我們的設(shè)計思想.
我們可以采用職責(zé)鏈完成所得稅的計算,由職責(zé)鏈上的一個對象負責(zé)計算某一段的所得稅.如果符合計算條件,則計算;否則由下一個對象計算.這里我們把核心的代碼寫出來。
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;
}
}
}
然后在頁面上去調(diào)用.
private void button1_Click(object sender, EventArgs e)
{
textBox2.Text = CompTax.GetInstance().Comp(double.Parse(textBox1.Text)).ToString();
}
這樣我們在GetInstance靜態(tài)方法中把處理各種的可能連接了起來.如果第一個對象不能滿足就用下一個對象來處理.一直直到能到處理為止.
在這里我們可以把cp這個數(shù)組從配置文件中讀取,這樣就實現(xiàn)了動態(tài)配置.說到這個我們還有很多地方可以用到這樣的設(shè)計模式.比如我們會員積分功能的時候,當(dāng)積分到了多少就可以做什么事等等也可以用職責(zé)鏈輕松解決了.
分享:關(guān)于IronPython和C#執(zhí)行速度對比其實我自己對執(zhí)行速度這個問題本來并沒有什么興趣,因為以前的經(jīng)驗告訴我:除非是運算密集型的程序,否則腳本語言和編譯型語言使用起來速度沒有多大差別。但是我們公司有個人知道我的想法以后,天天在我耳邊嚷嚷腳本運行速度太慢,那好吧,讓我用實驗來說服
- asp.net如何得到GRIDVIEW中某行某列值的方法
- .net SMTP發(fā)送Email實例(可帶附件)
- js實現(xiàn)廣告漂浮效果的小例子
- asp.net Repeater 數(shù)據(jù)綁定的具體實現(xiàn)
- Asp.Net 無刷新文件上傳并顯示進度條的實現(xiàn)方法及思路
- Asp.net獲取客戶端IP常見代碼存在的偽造IP問題探討
- VS2010 水晶報表的使用方法
- ASP.NET中操作SQL數(shù)據(jù)庫(連接字符串的配置及獲取)
- asp.net頁面?zhèn)髦禍y試實例代碼
- DataGridView - DataGridViewCheckBoxCell的使用介紹
- asp.net中javascript的引用(直接引入和間接引入)
- 三層+存儲過程實現(xiàn)分頁示例代碼
.Net教程Rss訂閱編程教程搜索
.Net教程推薦
- 解讀ASP.NET編寫應(yīng)用程序的十大技巧
- 淺析ASP.NET MVC :MVC頁面驗證與授權(quán)
- GridView中動態(tài)設(shè)置CommandField是否可用或可見的小例子
- 詳解asp.net控件CheckBoxList的使用
- Asp.net Mvc Framework可以在Controller中使用的Url.Action方法
- 給初學(xué).net的您幾點建議
- 揭秘.Net開發(fā)常用十大輔助軟件
- ASP.NET 遍歷配置文件的連接字符串
- ASP.NET遍歷配置文件的連接字符串
- asp.net中使用repeater和PageDataSource搭配實現(xiàn)分頁代碼
- 相關(guān)鏈接:
- 教程說明:
.Net教程-談.net 中的職責(zé)鏈模式的使用
。