設計模式之策略模式 Strategy Pattern
- V1.0
- 核心概念
- 角色
- 代碼示例
- 程序運行結果
- 代碼講解
- 適用范圍
V1.0
核心概念
策略模式是一種行為型設計模式,其核心思想是業務類執行某個動作時,可以使用該動作的不同的實現,并在程序運行中可以切換使用該動作的不同的實現。
不同的動作的實現被封裝為不同的類,這些具體實現類繼承統一的接口,因此業務類可以持有任一動作具體實現,并可以對其進行替換。
角色
- Strategy(策略接口):定義了動作的統一接口,具體策略需要實現該接口。
- ConcreteStrategy(具體策略):實現了策略接口,不同的具體策略實現了同一動作的不同實現。
- Context(上下文):持有具體策略的引用,在業務中執行具體策略,并可以更換不同的具體策略,以使用同一動作的不同的實現方式。
代碼示例
/// <summary>
/// 交通方式策略接口,定義了動作的統一接口
/// </summary>
public interface ITransportationMode
{public void Travel();
}/// <summary>
/// 具體策略,乘坐飛機
/// </summary>
public class ConcreteModeAirplane:ITransportationMode
{public void Travel(){Console.WriteLine("Travel by airplane");}
}/// <summary>
/// 具體策略,乘坐火車
/// </summary>
public class ConcreteModeTrain : ITransportationMode
{public void Travel(){Console.WriteLine("Travel by train");}
}/// <summary>
/// 具體策略,乘坐長途汽車
/// </summary>
public class ConcreteModeCoach : ITransportationMode
{public void Travel(){Console.WriteLine("Travel by coach");}
}/// <summary>
/// 上下文類,可以使用不同的出行方式出行
/// </summary>
public class ContextTravelPlan
{/// <summary>/// 出行方式/// </summary>public ITransportationMode mean;public ContextTravelPlan(ITransportationMode mean){this.mean = mean;}/// <summary>/// 更換策略,即出行方式/// </summary>/// <param name="newMean"></param>public void setMean(ITransportationMode newMean){this.mean = newMean;}public void travelTo(string place){mean.Travel();Console.WriteLine($"Traveled to {place}");}
}public class Program
{public static void Main(string[] arg){//建立具體策略對象ConcreteModeAirplane meanAirplane = new();ConcreteModeTrain meanTrain = new();ConcreteModeCoach meanCoach = new();//建立旅行計劃上下文類ContextTravelPlan ctp = new(meanAirplane);//使用飛機方式出行ctp.travelTo("Shanghai");//更換策略,使用火車出行方式ctp.setMean(meanTrain);//使用火車方式出行ctp.travelTo("Chongqing");//更換策略,使用長途汽車出行方式ctp.setMean(meanCoach);//使用長途汽車出行ctp.travelTo("Jinan");}
}
程序運行結果
Travel by airplane
Traveled to Shanghai
Travel by train
Traveled to Chongqing
Travel by coach
Traveled to Jinan
代碼講解
- ITransportationMode接口:策略接口,定義了交通方式的統一接口
Travel
,具體的交通方式需要實現這個接口。 - ConcreteModeAirplane類:具體策略,實現了交通方式接口
Travel
,為乘坐飛機出行,接口實現中輸出了乘坐飛機出行的信息。 - ConcreteModeTrain類:具體策略,實現了交通方式接口
Travel
,為乘坐火車出行,接口實現中輸出了乘坐火車出行的信息。 - ConcreteModeCoach類:具體策略,實現了交通方式接口
Travel
,為乘坐長途汽車出行,接口實現中輸出了乘坐長途汽車出行的信息。 - ContextTravelPlan類:上下文類,是具體的業務邏輯,構造時使用具體出行方式對象(具體策略對象)構建,并可以使用
setMean
方法替換具體出行方式(具體策略)。toTravel
方法是上下文類的具體的業務邏輯,其中使用其持有的出行方式mean
,出行到指定的地方。 - Program類:客戶端代碼,創建了具體出行方式(具體策略),使用飛機出行方式
meanAirplane
創建了出行上下文類,執行出行動作。更換出行方式,即具體策略,再次進行出行動作,重復2次。
適用范圍
- 當一個動作可能有多種實現,并且需要在不同時間修改使用不同的動作實現時。
- 將來可能添加新的動作實現的場景,使用策略模式可以不修改現有的代碼。