天天看點

3.9政策模式

1.什麼是政策模式?

        本質:面向借口程式設計。或者說政策模式是面向接口程式設計的最佳展現。

        他抽象的是不同的算法,或者說政策。

        比如稅收,有個稅和企業稅。這是兩種不同的算法,或者叫不同的政策。

2.利用接口實作政策模式:

//業務簡述:稅收分國稅,企業稅,個人稅等等,不同稅算法不同。      
//政策模式本質就是面向接口程式設計,不同的算法可以了解為不同的政策
      
//抽象稅收算法
public interface ITaxStrategy
{
  double Calculate(double income)
}

//個稅
public class ITaxPerson:ITaxStrategy
{
  public double Calculate(double income)
  {
    return income*0.1;
  }
}

//企稅
public class ITaxEnterprice:ITaxStrategy
{
  public double Calculate(double income)
  {
    return income*0.3;
  }
}
      
//…… 其他未來不确定的稅收算法      
public class TaxManager
{
  public ITaxStrategy _itax
      
  //接口作為參數,降低耦合,保證了不管未來是出現何種算法,保證這裡的子產品是穩定的;利用構造函數執行注入。      
  public Taxmanager(ITaxStrategy itax)
  {
    _itax=itax;
  }

  public double GetTex(double income)
  {
    _itax.Calculate(income);
  }
}

public class Program
{
  public static void Main(string[] args)
  {      
ITaxStrategy itax=new ITaxPerson();    TaxManager taxManager=new TaxManager(itax);      
//TaxManager和ITaxStrategy 的耦合,可以利用配置檔案,依賴注入,表驅動等技術徹底解決之間的依賴關系。      
      taxManager.GetTax(20000);
  }
}
      

3.利用委托實作政策模式:

        委托是一種引用方法的類型,委托本質是一個類,相當于類型安全的C++的函數指針。定義委托實際上就是定義一個行為接口。隻要符合該行為接口的方法,都可以賦給委托。從這個角度來說,委托是方法級别的抽象,接口是對象級别的抽象,委托沒有接口那樣的強制要求實作,且針對靜态方法。是以相對于接口,委托是一種更加開放的抽象。

        接下來,我們用委托來實作稅收政策。

委托方法簽名

public delegate double TaxCalculateHandler(double income);

public class Tax

{  

//個稅  
public double TaxPersonCalculate(double income)  {return income*0.1;}
//企稅  
publice double TaxEnterpriceCalculate(double income)  {return income*0.3;}
      
//…… 其他未來不确定的稅收算法      

}

public class TaxManager{  

  private TaxCalculateHandler _delegateCal

//委托作為參數,降低耦合,保證了不管未來是出現何種算法,保證這裡的子產品是穩定的;利用構造函數執行注入。

  public Taxmanager(TaxCalculateHandler itax)  

  {    

    this._delegateCal=itax;  

  }  

  public double GetTex(double income)  

    _delegateCal(income);  

  }

public class Program{  

  public static void Main(string[] args)  {    

    TaxManager taxManager=new TaxManager(Tax.TaxPersonCalculate);    

    taxManager.GetTax(1000);  

}

      

接口和委托的差別:

相同點:

          接口和委托均完成了對行為的抽象,但是二者實作的本質

不同點:

卻有面向對象和面向過程之分。

1.前者是直接将方法封裝為對象,後者則是直接對方法的操作。

2.前者可以被任何類實作,但是隻能實作為公開的方法。

對于後者,隻要某一個方法符合委托的方法簽名,不管是靜态方法,還是匿名函數或者Lambda表達式,都可以傳遞給委托。

3.從抽象的程度看,委托更徹底。

4.在.NET種,委托更多的是被用于事件,異步調用,回調方法當中,尤其是觀察者模式中,使用委托更是事半功倍

繼續閱讀