3.9策略模式
1.什麼是策略模式?
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);
}
介面和委託的區別:
本質:面向藉口程式設計。或者說策略模式是面向介面程式設計的最佳體現。
他抽象的是不同的演算法,或者說策略。
比如稅收,有個稅和企業稅。這是兩種不同的演算法,或者叫不同的策略。
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 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種,委託更多的是被用於事件,非同步呼叫,回撥方法當中,尤其是觀察者模式中,使用委託更是事半功倍
相關文章
- 3.9
- 策略模式模式
- 策略模式、策略模式與Spring的碰撞模式Spring
- iOS模式分析 策略模式iOS模式
- 設計模式——策略模式設計模式
- 設計模式(策略模式)設計模式
- 設計模式-策略模式設計模式
- PHP 模式大全 - 策略模式PHP模式
- 設計模式🔫---策略模式設計模式
- 策略模式(Strategy)模式
- 策略模式初探模式
- java策略模式Java模式
- 理解策略模式模式
- JavaStrategyPattern(策略模式)JavaAST模式
- 策略(Startegy)模式模式
- java 策略模式Java模式
- RabbitMQ 3.9( 續 )MQ
- 設計模式之策略模式設計模式
- js設計模式--策略模式JS設計模式
- 小白設計模式:策略模式設計模式
- 策略模式與模板方法模式模式
- 設計模式之【策略模式】設計模式
- 行為型模式--策略模式模式
- 設計模式(一) 策略模式設計模式
- php設計模式–策略模式PHP設計模式
- 設計模式(八)——策略模式設計模式
- 設計模式(四):策略模式設計模式
- 命令模式 & 策略模式 & 模板方法模式
- 設計模式-策略模式(轉)設計模式
- 【設計模式之策略模式】設計模式
- 設計模式 #5 (策略模式、代理模式)設計模式
- 大話--策略模式模式
- 策略模式【Strategy Pattern】模式
- 策略模式總結模式
- 玩轉策略模式模式
- 【雜談】策略模式模式
- if else與策略模式模式
- 16_策略模式模式