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種,委托更多的是被用于事件,異步調用,回調方法當中,尤其是觀察者模式中,使用委托更是事半功倍