深圳網站建設公司哪家專業(yè)今日國內新聞10則
🚀簡介
🐤作為一個開發(fā)人員,開發(fā)需要選擇一款開發(fā)工具,如在編寫C#時,我們可以選擇VisualStudio進行開發(fā),也可以使用Rider 進行開發(fā)。
🐳該模式定義了一系列算法,并將每個算法封裝起來,使它們可以相互替換,且算法的變化不會影響使用算法的客戶。策略模式屬于對象行為模式,它通過對算法進行封裝,把使用算法的責任和算法的實現分割開來,并委派給不同的對象對這些算法進行管理。
👻策略模式的主要角色如下:
- 抽象策略(Strategy)類:這是一個抽象角色,通常由一個接口或抽象類實現。此角色給出所有的具體策略類所需的接口。
- 具體策略(Concrete Strategy)類:實現了抽象策略定義的接口,提供具體算法實現或行為
- 環(huán)境(Context)類:持有一個策略類的引用,最終給客戶端調用。
🚀案例
我們通過一個活動策劃來舉例策略模式,如商城中的店鋪搞促銷活動,有時活動是買一送一,有時候是全場八折。
🐤抽象策略類(活動共同的接口)
public interface IStrategy
{void show();
}
🐤具體策略角色,對策略類進行活動A“買一送一”,活動B“全場八折”的具體實現
public class StrategyA : IStrategy
{public void show(){Console.WriteLine("買一送一");}
}public class StrategyB : IStrategy
{public void show(){Console.WriteLine("全場8折!");}
}
🐤定義環(huán)境角色( Context ):用于連接上下文
Context類有一個構造函數,接受一個IStrategy類型的參數,用于初始化_strategy成員變量,然后根據傳遞給這個對象的具體策略對象,執(zhí)行相應的行為。這樣,我們可以在運行時改變Context對象的行為,只需要傳遞不同的策略對象即可。
public class Context
{private IStrategy _strategy;public Context(IStrategy strategy){_strategy = strategy;}public void salesManShow(){_strategy.show();}
}
🐤測試類
class MyClass
{public static void Main(string[] args){var contextA = new Context(new StrategyA());contextA.salesManShow();var contextB = new Context(new StrategyB());contextB.salesManShow();}
}
運行結果!
🚀優(yōu)缺點
優(yōu)點:
- 策略類之間可以自由切換由于策略類都實現同一個接口,所以使它們之間可以自由切換。
- 易于擴展,增加一個新的策略只需要添加一個具體的策略類即可,基本不需要改變原有的代碼,符合“開閉原則“
- 避免使用多重條件選擇語句(if else),充分體現面向對象設計思想。
缺點:
- 客戶端必須知道所有的策略類,并自行決定使用哪一個策略類。
- 策略模式將造成產生很多策略類,可以通過使用享元模式在一定程度上減少對象的數量。
使用場景
- 一個系統(tǒng)需要動態(tài)地在幾種算法中選擇一種時,可將每個算法封裝到策略類中。
- 一個類定義了多種行為,并且這些行為在這個類的操作中以多個條件語句的形式出現,可將每個條件分支移入它們各自的策略類中以代替這些條件語句。
- 系統(tǒng)中各算法彼此完全獨立,且要求對客戶隱藏具體算法的實現細節(jié)時。
- 系統(tǒng)要求使用算法的客戶不應該知道其操作的數據時,可使用策略模式來隱藏與算法相關的數據結構。
- 多個類只區(qū)別在表現行為不同,可以使用策略模式,在運行時動態(tài)選擇具體要執(zhí)行的行為。