熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

淺談.net 中的職責鏈模式的使用

2013-11-13 09:45:40  來源: .NET編程 

  職責鏈模式使多個對象都有機會處理請求從而避免請求的發送者和接收者之間的耦合關系將這些對象連成一條鏈並沿著這條鏈傳遞該請求直到有一個對明處理它為止

  職責鏈模式的結果如下圖

  

  Handler:定義一個處理請求的接口並實現後繼鏈

  ConcreteHandler:處理負責的請求並可訪問後繼者如果可處理該請求則處理之否則將該請求轉發給後繼者

  Client:向鏈上的具體處理者對象提交請求

  在這裡先用一個簡單的例子計算所得稅來說明一下職責鏈模式在應用中的作用

  先簡要的說一下計算所得稅的方法:

  以成都為例:

  計算金額應納稅額個稅率
元/月以內免稅
元/月以上至元/月不超過%
元/月以上至元/月元至%
元/月以上至元/月元至%
元/月以上至元/月元至%
元/月以上至元/月元至%
元/月以上至元/月元至%
元/月以上至元/月元至%
元/月以上至元/月元至%
元/月以上元以上%

  (工資)*相應工資范圍的個稅率

  當你看到這樣的一個計算方式之後你心裡是不是已經有了自己的想法了?寫一系列的if語句來一條條的判斷但這樣的寫法雖然可以實現目前的需求可如果當稅率發生了變化你又得拿出你的程序一步一步的修改如果if語句的條數發生變化的話我們還必須在代碼中添加必要的if判斷這對於程序的維護來說是相當麻煩的如果我們使用職責鏈模式的話就可以相當簡單了

  先說說我們的設計思想

  我們可以采用職責鏈完成所得稅的計算由職責鏈上的一個對象負責計算某一段的所得稅如果符合計算條件則計算;否則由下一個對象計算這裡我們把核心的代碼寫出來

  using System;
using SystemCollectionsGeneric;
using SystemLinq;
using SystemText;

  namespace CompTax
{
    public class CompTax
    {
        private double Taxp;
        private double Minincome;
        private static double Disc=;
        private CompTax NextCompTax;
        public CompTax(double Minincome double Taxp)
        {
            thisMinincome = Minincome;
            thisTaxp = Taxp;
            NextCompTax = null;
        }
        public double Comp(double income)
        {

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

  public static CompTax GetInstance()
        {
            CompTax[] cp ={
                             new CompTax()
                             new CompTax()
                             new CompTax()
                             new CompTax()
                             new CompTax()
                             new CompTax()
                             new CompTax()
                             new CompTax()
                             new CompTax()
                         };
            CompTax ct=null;
            for (int i = ; i < cpLength; i++)
            {
                if (i == )
                    ct = cp[i];
                cp[i]NextCompTax = cp[i + ];
            }
            return ct;
        }
    }
}

  然後在頁面上去調用

  private void button_Click(object sender EventArgs e)
        {
            textBoxText = CompTaxGetInstance()Comp(doubleParse(textBoxText))ToString();
        }
這樣我們在GetInstance靜態方法中把處理各種的可能連接了起來如果第一個對象不能滿足就用下一個對象來處理一直直到能到處理為止

  在這裡我們可以把cp這個數組從配置文件中讀取這樣就實現了動態配置說到這個我們還有很多地方

  可以用到這樣的設計模式比如我們會員積分功能的時候當積分到了多少就可以做什麼事等等也可以用職責鏈輕松解決了


From:http://tw.wingwit.com/Article/program/net/201311/11516.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.