如果在写程序的时候,你的程序中有很多算法,而且在运行的时候时常需要切换不同的算法,如果你还是像以前一样使
用简单工厂模式实现时没有问题的,但是每次维护和扩展的时候都需要改动这个工厂,以致代码需要重新编译部署,这样
就增大了工作量,更要命的是这样设计的程序是非常的糟糕的,那么我们是不是考虑一下使用其他的模式呢?
经过编程大牛们的辛苦研究,研究出了一个很好模式解决这类问题,它就是----策略模式!我们来认识认识它吧!
策略模式(Stategy):它定义了算法家族,分别封装起来,让它们之间可以互相转换,此模式让算法的变化,不会影响到使
用算法的客户.
看这些定义来理解策略模式,似乎有点困难,那么我们就来看看策略模式的类图和实现代码:
类图:
对应类图的实现代码:
namespace 策略模式
{
/// <summary>
/// Stategy类, 定义所有支持的算法的公共接口
/// </summary>
///
abstract class Strategy
{
//算法方法
public abstract void Algorithmlnterface();
}
/// <summary>
/// ConcreteStrategyA,封装了具体的算法或行为继承与Strategy
/// </summary>
/// ConcreteStrategyC继承Strategy
class ConcreteStrategyA : Strategy
{
//算法A实现方法
public override void Algorithmlnterface()
{
Console.WriteLine("算法A实现");
}
}
/// <summary>
/// ConcreteStrategyB,封装了具体的算法或行为继承与Strategy
/// </summary>
/// ConcreteStrategyC继承Strategy
class ConcreteStrategyB : Strategy
{
//算法B的实现
public override void Algorithmlnterface()
{
Console.WriteLine("算法B的实现");
}
}
/// <summary>
/// ConcreteStrategyC,封装了具体的算法或行为继承与Strategy
/// </summary>
/// ConcreteStrategyC继承Strategy
class ConcreteStrategyC : Strategy
{
//算法C的实现
public override void Algorithmlnterface()
{
Console.WriteLine ("算法C的实现");
}
}
/// <summary>
/// Context,用一个ConcreteStrategy来配置,维护一个队Strategy对象的引用
/// </summary>
///上下文,Context与Strategy组合关系
class Context
{
private Strategy strategy;
public Context(Strategy strategy)
{
this.strategy = strategy;
}
//上下文接口
public void ContextInterfacae()
{
strategy.Algorithmlnterface();
}
}
/// <summary>
/// 客户端代码
/// </summary>
/// Main函数,程序的入口
class Program
{
static void Main(string[] args)
{
Context context;
context = new Context(new ConcreteStrategyA());
context.ContextInterfacae();
context = new Context(new ConcreteStrategyB());
context.ContextInterfacae();
context = new Context(new ConcreteStrategyC());
context.ContextInterfacae();
Console.Read();
}
}
}
策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成度都是相同的工作,只是实现不同,它可以
以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合.
策略模式的Strategy类层为Context定义了一系列的可供重用的算法或行为,继承有助于析取出这些算法中公共功
能.
了解了它们的类图和对应的实现代码,我们来看看它们的优缺点和使用情况:
优点:
1.提供了一种替代继承方法,而且既保持了继承的优点,还比继承更灵活
2.避免程序中使用多重条件转移语句,使系统更灵活,并易于扩展
3.高内聚,低耦合
缺点:
1.因为每个具体策略模式都会产生一个新类,所以会增加系统需要维护的类的数量
使用场景:
1.多个类之区别在表现行为不同,可以使用Strategy模式,在运行时动态选择具体要执行的行为.
2.需要在不同情况下使用的算法,或者算法还可以在未来用其他方式来实现.
3.对客户隐藏具体算法的实现细节,彼此完成独立