策略模式是属于设计模式中对象行为型模式,主要是定义一系列的算法,把这些算法一个个封装成单独的类.
它的UML图:
Strategy是一个策略类,其中定义一个或多个算法接口
ConcreteStrategy是实现算法接口的具体策略类
Context是上下文应用
比如,我要从龙阳路去浦东国际机场,我可以选择坐公交、可以选择打车、可以选择坐磁悬浮。
这里的乘车方式就是一个可变的,因此独立为一接口
如策略接口
- public interface IToAerodrome
- {
- void ToDo();
- }
public interface IToAerodrome { void ToDo(); }
实现该接口(算法)的具体类
- public class ByBus : IToAerodrome
- {
- #region IToAerodrome 成员
- public void ToDo()
- {
- Console.WriteLine("乘坐公交车去机场");
- }
- #endregion
- }
- public class ByTaxi : IToAerodrome
- {
- #region IToAerodrome 成员
- public void ToDo()
- {
- Console.WriteLine("我乘坐出租车去机场");
- }
- #endregion
- }
- public class ByTrain : IToAerodrome
- {
- #region IToAerodrome 成员
- public void ToDo()
- {
- Console.WriteLine("坐每小时200公里的磁悬浮");
- }
- #endregion
- }
public class ByBus : IToAerodrome { #region IToAerodrome 成员 public void ToDo() { Console.WriteLine("乘坐公交车去机场"); } #endregion } public class ByTaxi : IToAerodrome { #region IToAerodrome 成员 public void ToDo() { Console.WriteLine("我乘坐出租车去机场"); } #endregion } public class ByTrain : IToAerodrome { #region IToAerodrome 成员 public void ToDo() { Console.WriteLine("坐每小时200公里的磁悬浮"); } #endregion }
- public class ToAerodromeStrategy
- {
- IToAerodrome _ToAerodrome;
- /// <summary>
- /// 构造函数,以实现IToAerodrome的类实体为参数
- /// </summary>
- /// <param name="toAerodrome"></param>
- public ToAerodromeStrategy(IToAerodrome toAerodrome)
- {
- _ToAerodrome = toAerodrome;
- }
- /// <summary>
- /// 改变当前的策略
- /// </summary>
- /// <param name="toAerodrome"></param>
- public void ChangeStrategy(IToAerodrome toAerodrome)
- {
- _ToAerodrome = toAerodrome;
- }
- /// <summary>
- /// 执行方法
- /// </summary>
- public void Go()
- {
- _ToAerodrome.ToDo();
- }
- }
public class ToAerodromeStrategy { IToAerodrome _ToAerodrome; /// <summary> /// 构造函数,以实现IToAerodrome的类实体为参数 /// </summary> /// <param name="toAerodrome"></param> public ToAerodromeStrategy(IToAerodrome toAerodrome) { _ToAerodrome = toAerodrome; } /// <summary> /// 改变当前的策略 /// </summary> /// <param name="toAerodrome"></param> public void ChangeStrategy(IToAerodrome toAerodrome) { _ToAerodrome = toAerodrome; } /// <summary> /// 执行方法 /// </summary> public void Go() { _ToAerodrome.ToDo(); } }
context
- static void Main(string[] args)
- {
- ToAerodromeStrategy to = new ToAerodromeStrategy(new ByBus());
- to.Go();
- Console.WriteLine("我要改坐磁悬浮");
- to.ChangeStrategy(new ByTrain());
- to.Go();
- Console.Read();
- }
static void Main(string[] args) { ToAerodromeStrategy to = new ToAerodromeStrategy(new ByBus()); to.Go(); Console.WriteLine("我要改坐磁悬浮"); to.ChangeStrategy(new ByTrain()); to.Go(); Console.Read(); }
执行结果