定义:策略模式定义并封装了一系列算法,它们之间可以相互替换,且算法的变化不会对算法的使用者造成影响。
优点:灵活替换,代码复用性强;完美支持开闭原则。
缺点:过多的策略拓展会使代码变得复杂,不容易理解。
从定义中可以得知该模式会定义一系列的算法,这里需要考虑到开闭原则使用接口、实现的方式进行拓展;而算法之间可以互相替换,可以封装一个中间类根据不同的算法执行相应的逻辑避免外部对策略的直接调用,外部逻辑只需要调用中间类的执行方法即可。
简单的用一张图表示:
策略封装代码示例:
public interface IStrategy
{
void Method();
}
public class StrategyA : IStrategy
{
public void Method()
{
Print("执行A类中的方法");
}
}
public class StrategyB : IStrategy
{
public void Method()
{
Print("执行B类中的方法");
}
}
public class Context
{
private IStrategy strategy;
public void SetStrategy(IStrategy _strategy)
{
strategy = _strategy;
}
public void ExecuteStrategy()
{
strategy.Method();
}
}
外部调用代码示例:
public void Demo()
{
Context context = new Context();
//执行A策略
IStrategy a = new StrategyA();
context.SetStrategy(a);
context.ExecuteStrategy();
//执行B策略
IStrategy b = new StrategyB();
context.SetStrategy(b);
context.ExecuteStrategy();
}
执行Demo方法可得到结果
执行A类中的方法
执行B类中的方法