3.2 策略模式的代码实现
/// <summary>
/// 策略类,定义了所有支持的算法的公共接口
/// </summary>
public abstract class Stratege
{
/// <summary>
/// 策略类中支持的算法,当然还可以有更多,这里只定义了一个。
/// </summary>
public abstract void Algorithm();
}
/// <summary>
/// 具体策略 A,实现了一种具体算法
/// </summary>
public class ConcreteStrategeA : Stratege
{
/// <summary>
/// 具体算法
/// </summary>
public override void Algorithm()
{
// 策略A中实现的算法
}
}
/// <summary>
/// 具体策略 B,实现了一种具体算法
/// </summary>
public class ConcreteStrategeB : Stratege
{
/// <summary>
/// 具体算法
/// </summary>
public override void Algorithm()
{
// 策略B中实现的算法
}
}
/// <summary>
/// Context 上下文,维护一个对Stratege对象的引用
/// </summary>
public class Context
{
private Stratege m_Stratege;
/// <summary>
/// 初始化上下文时,将具体策略传入
/// </summary>
/// <param name="stratege"></param>
public Context(Stratege stratege)
{
m_Stratege = stratege;
}
/// <summary>
/// 根据具体策略对象,调用其算法
/// </summary>
public void ExecuteAlgorithm()
{
m_Stratege.Algorithm();
}
}
4. 模式总结
4.1 优点
4.1.1 策略模式是一种定义一系列算法的方法,从概念上来看,所有算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合。
4.1.2 策略模式的Stratege类为Context定义了一系列的可供重用的算法或行为。继承有助于析取出这些算法的公共功能。
4.1.3 策略模式每个算法都有自己的类,可以通过自己的接口单独测试。因而简化了单元测试。
4.1.4 策略模式将具体算法或行为封装到Stratege类中,可以在使用这些类中消除条件分支(避免了不同行为堆砌到一个类中)。
4.2 缺点
将选择具体策略的职责交给了客户端,并转给Context对象
4.3 适用场景
4.3.1 当实现某个功能需要有不同算法要求时
4.3.2 不同时间应用不同的业务规则时










