策略模式简介
定义了一组算法,将每个算法都封装起来,并且使它们之间可以互换。在有多种算法相似的情况下,使用 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
菜鸟教程|设计模式
更多: