在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。简而言之,就是定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。
使用场景:一个系统中有若干个类,我们可以把它看成不同行为或者策略,在不同的业务场景中,这些行为可以任意地组合,删减和替换来完成一项功能。在实际场景中,系统在执行某个流程时,如果在主流程前后有一些附加动作,比如参数校验,数据拼装,记录写入可以使用策略模式,避免了过多的if else,增强代码可读性。
下面用策略模式实现一个简单的Demo:
一:创建接口
interface IBeforeAction
{
void Action();
}
二:创建实体类(策略),实现接口
//策略一:
class BeforeActionOne : IBeforeAction
{
public void Action()
{
Console.WriteLine("This is BeforeActionOne.");
}
}
//策略二:
class BeforeActionTwo : IBeforeAction
{
public void Action()
{
Console.WriteLine("This is BeforeActionTwo.");
}
}
三:创建ActionManager管理类
public class ActionManager
{
public static ActionManager Instance { get; } = new ActionManager();
private ActionManager()
{
//初始化执行策略集合
IBeforeActions = new List<IBeforeAction>()
{
new BeforeActionOne(),
new BeforeActionTwo()
};
IAfterActions = new List<IAfterAction>()
{
new AfterActionOne(),
new AfterActionTwo()
};
}
List<IBeforeAction> IBeforeActions { get; set; }
List<IAfterAction> IAfterActions { get; set; }
public void Run()
{
//执行策略
foreach (var beforeAction in IBeforeActions)
{
beforeAction.Action();
}
//执行主方法
Console.WriteLine("Main method is running...");
foreach (var afterAction in IAfterActions)
{
afterAction.Action();
}
}
}
四:主方法执行
class StrategyPattern
{
static void Main(string[] args)
{
ActionManager.Instance.Run();
Console.Read();
}
}
五:执行程序,输出结果:
This is BeforeActionOne.
This is BeforeActionTwo.
Main method is running...
This is AfterActionOne.
This is AfterActionTwo.