3.9策略模式

jackyfei發表於2014-03-24

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種,委託更多的是被用於事件,非同步呼叫,回撥方法當中,尤其是觀察者模式中,使用委託更是事半功倍

 


相關文章