Strategy
策略模式:该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户端。
当我们出去旅游的时候,出行方式很多,如飞机、火车、轮船等等,这些不同的交通方式,其实就是一个个不同的算法,我们可以根据不同的场合选择不同的交通方式。在程序中也就是根据不同的场景,选择不同的算法。这就是策略模式。再比如我们要对一组数据进行排序处理时,可排序的算法有很多,如冒泡排序、选择排序、插入排序等等,也许我们在不同的时候会根据特殊的情况考虑算法的时间复杂度、空间复杂度对当前运行的影响,从而选择使用不同的算法,这也是策略模式想到达的目地:动态的替换策略算法,而不影响原有逻辑。UML图如下:
1、场景描述
就利用上面举出的旅游的例子,根据场景动态选择出行方式。利用策略模式来实现。
2、实现
/// <summary>/// 策略抽象/// 出行方式策略/// </summary>public interface IStrategy{/// <summary>/// 出发/// </summary>void StartOff();}/// <summary>/// 策略--飞机旅行/// </summary>public class AirplaneStrategy : IStrategy{public void StartOff(){Console.WriteLine("乘坐飞机旅行...");}}/// <summary>/// 策略--火车旅行/// </summary>public class TrainStrategy : IStrategy{public void StartOff(){Console.WriteLine("乘坐火车旅行...");}}/// <summary>/// 旅游/// </summary>public class Travel{private IStrategy _strategy;public Travel(IStrategy strategy){this._strategy = strategy;}/// <summary>/// 出发/// </summary>public void Depart(){Console.WriteLine("准备出发旅行");if (_strategy != null)_strategy.StartOff();}}// 客户端调用IStrategy airplane = new AirplaneStrategy();Travel travel1 = new Travel(airplane);travel1.Depart();Console.WriteLine("*************************");IStrategy train = new TrainStrategy();Travel travel2 = new Travel(train);travel2.Depart();
3、优缺点
优点:
- 客户端根据不同情况,随时更换“策略”,灵活度高
- 扩展新功能,仅增加新的策越算法即可,对现有功能无需更改,扩展型强,便于维护
缺点:
