1.定义
Define a family of algorithms,encapsulate each one,and make them interchangeable.(定义一组算法,将每个算法都封装起来,并且使它们之间可以互换)
2.模式说明
Context:封装角色
屏蔽高层模块对策略、算法的直接访问,封闭可能存在的变化。
Stratety:抽象策略角色
定义每个策略或算法必须具有的方法和属性。
ConcreteStategy:具体策略角色
3.代码实现
public interface IStategy { void DoSomeThing(); } public class ConcreteStategy1 : IStategy { public void DoSomeThing() { } } public class ConcreteStategy2 : IStategy { public void DoSomeThing() { } } public class Context { private readonly IStategy _stategy; //构造函数设置具体策略 public Context(IStategy stategy) { _stategy = stategy; } public void DoSomeThing() { _stategy.DoSomeThing(); } }
/// <summary> /// 场景类 /// </summary> class Program { private static void Main(string[] args) { ConcreteStategy1 stategy1 = new ConcreteStategy1(); Context context = new Context(stategy1); context.DoSomeThing(); Console.ReadKey(); } }
4.策略模式的优缺点
(2)优点
.扩展性良好。在现有的系统中增加一个策略太容易了,只要实现接口就可以了,其他都不用修改。
(1)缺点
.策略类数量增多
.所有的策略类都需要对外暴露,上层模块必须知道有哪些策略,然后才能决定使用哪一个策略。