定义
策略模式定义了一系列的算法。
它将每一个算法封装起来,而且使它们还可以「相互替换」。
策略模式让算法独立于使用它的客户而独立变化
类图
代码
namespace 策略模式
{
class Program
{
static void Main(string[] args)
{
Context context;
context = new Context(newConcreteStrategyA());
context.ContextInterface();
context = new Context(newConcreteStrategyB());
context.ContextInterface();
context = new Context(newConcreteStrategyC());
context.ContextInterface();
Console.Read();
}
}
//抽象算法类
abstract class Strategy
{
//算法方法
public abstract voidAlgorithmInterface();
}
//具体算法A
class ConcreteStrategyA : Strategy
{
//算法A实现方法
public override voidAlgorithmInterface()
{
Console.WriteLine("算法A实现");
}
}
//具体算法B
class ConcreteStrategyB : Strategy
{
//算法B实现方法
public override voidAlgorithmInterface()
{
Console.WriteLine("算法B实现");
}
}
//具体算法C
class ConcreteStrategyC : Strategy
{
//算法C实现方法
public override voidAlgorithmInterface()
{
Console.WriteLine("算法C实现");
}
}
//上下文
class Context
{
Strategy strategy;
public Context(Strategy strategy)
{
this.strategy = strategy;
}
//上下文接口
public void ContextInterface()
{
strategy.AlgorithmInterface();
}
}
}
何时用
当我们在不同的情况下使用不同的算法的时候。
总结
关于策略模式,在Head First设计模式中是各个算法对接口的实现,而在大话设计模式中是对抽象类的继承。
关于策略模式用抽象类还是接口,视情况而定。
在Head First设计模式中,是对鸭子的飞,叫这些具体行为进行抽象,所以采用的是接口。这样,其他类可以对多个接口实现,也就可以获得多种行为。
在大话设计模式中,是对一些收费策略抽象,所以采用的是抽象类。这样,子类就可以通过继承免去很多公共代码。
在我看来,抽象类是对目前所有类的公共代码的一个提取,后面的新建的类也可免去这部分代码;而接口使对目前所有公共同样行为的不同实现的一个标准规定,既然这些行为都是在干同一件事情,那么他们就共同实现一个接口,别人通过这个接口调用其中需要的那个就好。
最后,关于策略模式,就是对不同算法的封装。