策略模式簡介
定義了一組算法,將每個算法都封裝起來,並且使它們之間可以互換。在有多種算法相似的情況下,使用 if…else 所帶來的複雜和難以維護。將這些算法封裝成一個一個的類,任意地替換。
1、如果在一個系統裏面有許多類,它們之間的區別僅在於它們的行爲,那麼使用策略模式可以動態地讓一個對象在許多行爲中選擇一種行爲。
2、一個系統需要動態地在幾種算法中選擇一種。
3、如果一個對象有很多的行爲,如果不用恰當的模式,這些行爲就只好使用多重的條件選擇語句來實現
C# 策略模式Demo
AbstractLog.cs
namespace StrategyPattern
{
public abstract class AbstractLog
{
public abstract void Write(string msg);
}
}
FileLog.cs
using System;
namespace StrategyPattern
{
public class FileLog : AbstractLog
{
public override void Write(string msg)
{
if( msg.Length > 10)
{
throw new Exception("");
}
Console.WriteLine("記錄日誌到文本:{0}", msg);
}
}
}
DbLog.cs
using System;
namespace StrategyPattern
{
public class DbLog : AbstractLog
{
public override void Write(string msg)
{
Console.WriteLine("記錄日誌到數據庫:{0}", msg);
}
}
}
StrategyContext.cs
using System;
namespace StrategyPattern
{
public class StrategyContext
{
AbstractLog log = null;
public StrategyContext()
{
log = new FileLog();
}
public StrategyContext(AbstractLog log)
{
this.log = log;
}
public void Write(string msg)
{
try
{
log.Write(msg);
}
catch (Exception)
{
log = new DbLog();
log.Write(msg);
}
}
}
}
Program.cs
namespace StrategyPattern
{
class Program
{
static void Main(string[] args)
{
StrategyContext strategyContext = new StrategyContext();
strategyContext.Write("aaa");
strategyContext.Write("bbbbbbbbbbbbbbbb");
strategyContext = new StrategyContext(new DbLog());
strategyContext.Write("aaa");
strategyContext.Write("bbbbbbbbbbbbbbbb");
}
}
}
運行測試:
由本例可以看出:策略模式主要使用了面向對象多態的思想。
注意事項:如果一個系統的策略多於四個,就需要考慮使用混合模式,解決策略類膨脹的問題。 | |
---|---|
參考資源
https://www.bilibili.com/video/av78515440?t=876&p=9
菜鳥教程|設計模式
更多: