談.net 中的職責鏈模式的使用_.Net教程

      編輯Tag賺U幣
      教程Tag:暫無Tag,歡迎添加,賺取U幣!

      推薦:談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#執行速度對比
      其實我自己對執行速度這個問題本來并沒有什么興趣,因為以前的經驗告訴我:除非是運算密集型的程序,否則腳本語言和編譯型語言使用起來速度沒有多大差別。但是我們公司有個人知道我的想法以后,天天在我耳邊嚷嚷腳本運行速度太慢,那好吧,讓我用實驗來說服

      來源:模板無憂//所屬分類:.Net教程/更新時間:2009-08-22
      相關.Net教程