【設計模式之策略模式】
前言:
最近在學習設計模式,簡單工廠是接觸的第一個模式,後來,就遇到了策略模式,策略模式真是有謀略啊!定義了演算法家族,有了演算法家族,再難的計算都不在話下了!!!今天,我們一起來學習策略模式,看看這是一個怎樣的設計模式?
中心:
(一)定義
官方:
它定義了演算法家族,分別封裝起來起來,讓他們之間可以相互替代,此模式讓演算法的變化,不會影響到使用演算法的使用者。
個人理解:
定義了一系列的演算法,將演算法封裝在獨立的策略類中,既然獨立,就可以相互替代,所有的演算法完成的是相同的工作,只是實現不同,它以相同的方式呼叫所有的演算法。
相比繼承的優點:
繼承提供了一種支援多種演算法或行為的方法,而繼承使得演算法父類與子類混合,難以理解、維護、和擴充套件,還不同的動態的改變演算法,這是繼承的缺點,正是策略模式的優點。使用策略模式,使得易於切換、理解、和擴充套件。
(二)結構圖
UML圖:
例子:
以商場打折為例,可用下圖來理解策略模式。
(三)主要程式碼
Strategy類,定義所有支援的演算法的公共介面
<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;">//抽象演算法類
abstract class Strategy
{
//演算法方法
public abstract void AlgorithmInterface();
}</span></span></span>
ConcreteStrategy,封裝了具體的演算法或行為,繼承於Strategy<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;"> //具體演算法A
class ConcreteStrategyA:Strategy
{
//演算法A實現方法
public override void AlgorithmInterface()
{
Console.WriteLine("演算法A實現");
}
}
//具體演算法B
class ConcreteStrategyB : Strategy
{
//演算法b實現方法
public override void AlgorithmInterface()
{
Console.WriteLine("演算法B實現");
}
}
//具體演算法C
class ConcreteStrategyC : Strategy
{
//演算法A實現方法
public override void AlgorithmInterface()
{
Console.WriteLine("演算法C實現");
}
}</span></span></span>
Context,用一個ConcreteStrategy來配置,維護一個對Strategy物件的引用<span style="font-size:18px;"><span style="font-size:18px;"><span style="font-size:18px;"> //上下文
class Context
{
Strategy strategy;
public Context (Strategy strategy)
{
this.strategy = strategy;
}
//上下文介面
public void ContextInterface()
{
strategy.AlgorithmInterface();
}
}</span></span></span>
客戶端程式碼<span style="font-size:18px;"><span style="font-size:18px;"> <span style="font-size:18px;">static void Main(string[] args)
{
Context context;
context = new Context(new ConcreteStrategyA());
context.ContextInterface();
context = new Context(new ConcreteStrategyB());
context.ContextInterface();
context = new Context(new ConcreteStrategyC());
context.ContextInterface();
Console.Read();
}</span></span></span>
(四)定位
策略模式,從字面可以理解“出謀劃策”,是一種行為,故屬於行為型模式。
(五)優缺點
優點:減少耦合,簡化測試(單元測試)
缺點:客戶端知道所有的類,任務重,造成很多策略類
(六)何時用
1. 如果在一個系統裡面有許多類,它們之間的區別僅在於它們的行為
2. 一個系統的演算法使用的資料不可以讓客戶端知道。
3. 如果一個物件有很多的行為,
在實踐中,只要分析過程中聽到需要在不同時間應用不同的業務規則,就可以考慮使用策略模式。
總結:
策略模式,你懂了嗎?希望這篇部落格,對大家有用!
相關文章
- 設計模式之策略模式設計模式
- 設計模式之【策略模式】設計模式
- PHP 設計模式之策略模式PHP設計模式
- python設計模式之策略模式Python設計模式
- JavaScript 設計模式之策略模式JavaScript設計模式
- Javascript設計模式之策略模式JavaScript設計模式
- 略懂設計模式之策略模式設計模式
- JAVA設計模式之策略模式Java設計模式
- 設計模式漫談之策略模式設計模式
- javascript設計模式 之 2 策略模式JavaScript設計模式
- Java設計模式之(十四)——策略模式Java設計模式
- Java設計模式之策略模式示例Java設計模式
- 1/24 設計模式之策略設計模式 Strategy Pattern設計模式
- 設計模式(策略模式)設計模式
- 設計模式-策略模式設計模式
- 設計模式——策略模式設計模式
- 小白設計模式:策略模式設計模式
- 設計模式🔫---策略模式設計模式
- js設計模式--策略模式JS設計模式
- 設計模式 #5 (策略模式、代理模式)設計模式
- 【技巧篇】JavaScript設計模式之策略模式應用JavaScript設計模式
- JavaScript設計模式之策略模式【組合委託】JavaScript設計模式
- Python 中的設計模式詳解之:策略模式Python設計模式
- 【設計模式】漢堡中的設計模式——策略模式設計模式
- 設計模式之策略模式和狀態模式(strategy pattern & state pattern)設計模式
- Javascript設計模式(四)策略模式JavaScript設計模式
- PHP設計模式(3)—— 策略模式PHP設計模式
- JS設計模式六:策略模式JS設計模式
- 《Head First 設計模式》:策略模式設計模式
- Java設計模式-策略模式分析Java設計模式
- 設計模式專題-策略模式設計模式
- 設計模式(一) 支付策略模式設計模式
- 極簡設計模式-策略模式設計模式
- GoLang設計模式15 - 策略模式Golang設計模式
- 【嵌入式c++】設計模式之策略模式(Strategy)C++設計模式
- 23種設計模式(二)---策略設計模式設計模式
- 設計模式第二講--策略模式設計模式
- Head First 設計模式(1)-----策略模式設計模式
- c/c++設計模式---策略模式C++設計模式