3.7.1 模式意圖:
如果在系統(tǒng)中需要為某一行為提供多種方案柿扣,例如不同的折扣方式肖方;貨幣不同的匯率;到達某地不同的路線等情況未状,就可以使用策略模式俯画。
3.7.2 模式概念:
它屬于行為型模式,指對象有某個行為娩践,但是在不同的環(huán)境中活翩,可以在運行時為行為更改不同的算法烹骨。
3.7.3 模式元素:
- 策略抽象(BaseStrategy)
- 策略細節(jié)(StrategyWalk、StrategyShip等)
- 使用環(huán)境(Context)
3.7.4 代碼示例:
public abstract class BaseStrategy
{
public abstract string GetRoute(string from, string to);
}
public class StrategyWalk : BaseStrategy
{
public override string GetRoute(string from, string to)
{
return "步行到達";
}
}
public class StrategyShip : BaseStrategy
{
public override string GetRoute(string from, string to)
{
return "輪船到達";
}
}
public class StrategyTrain : BaseStrategy
{
public override string GetRoute(string from, string to)
{
return "火車到達";
}
}
public class StrategyAirplane : BaseStrategy
{
public override string GetRoute(string from, string to)
{
return "飛機到達";
}
}
public class Context
{
private BaseStrategy baseStrategy;
public Context(BaseStrategy baseStrategy)
{
this.baseStrategy = baseStrategy;
}
public string GetResult(string side1,string side2)
{
return baseStrategy.GetRoute(side1, side2);
}
}
調(diào)用示例代碼
void Start()
{
BaseStrategy strategy = new StrategyWalk();
Context context = new Context(strategy);
string route = context.GetResult("地點一", "地點二");
Debug.Log(route);
}
但是根據(jù)迪米特法則我們知道材泄,對應(yīng)類與類之間的關(guān)系沮焕,越少越好,如果我們的策略越多拉宗,那么上層業(yè)務(wù)邏輯需要知道的策略類也會隨之增加峦树,所以我們需要再次封裝轉(zhuǎn)移。
public class Context
{
private BaseStrategy baseStrategy;
public Context(string strategy)
{
switch (strategy)
{
case "步行":
this.baseStrategy = new StrategyWalk();
break;
case "輪船":
this.baseStrategy = new StrategyShip();
break;
case "火車":
this.baseStrategy = new StrategyTrain();
break;
case "飛機":
this.baseStrategy = new StrategyAirplane();
break;
default:
break;
}
}
public string GetResult(string side1,string side2)
{
return baseStrategy.GetRoute(side1, side2);
}
}
執(zhí)行
void Start()
{
Context context = new Context("飛機");
string route = context.GetResult("地點一", "地點二");
Debug.Log(route);
}
這樣上層只需要知道
Context
一個類就可以了旦事,其他的都轉(zhuǎn)移到下層執(zhí)行魁巩。
3.7.5 寫法對比:
略
3.7.6 模式分析:
根據(jù)定義的算法族可以使算法自由切換,擴展方便姐浮,但隨著算法類的增多谷遂,
contenxt
中的算法也會逐漸增加,提高了出錯的機率卖鲤,屆時需要對算法族再次封裝(例:按類別)肾扰,減少相互的干擾。
3.7.7 應(yīng)用場景:
需要為一種行為提供不同的策略來達到獲取不同結(jié)果的目的蛋逾。
3.7.8 小結(jié):
對于策略的選擇是放到
Context
里面還是放到上層業(yè)務(wù)邏輯中需要根據(jù)實際情況自行權(quán)衡集晚,但目的是一致的,就是減少類與類之間的依賴關(guān)系区匣,降低其耦合度偷拔。而且在開發(fā)中可以將不同的算法以序列化的形式保存,例如ScriptableObjects亏钩,這樣算法無需關(guān)心外部的環(huán)境而獨立的保存莲绰。