策略模式 类图
策略模式很好的诠释了面向对象的三大特征:
1.封装:Context封装了Strategy,以及对Strategy的操作及其他操作,如果要设置Strategy,必须通过Context来处理。
2.继承:ConcreteStrategy子类继承Strategy(这个的类图写的是接口,也可以是abstract class), 继承了strategyInterface方法。
3.多态:运行时,通过context设置strategy后,根据里氏替换原则LSP,我们可以使用任何一个ConcreteStrategy, 从而可以执行各自定义的业务逻辑。
策略模式的定义:
定义一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换,
策略模式使这些算法在客户端调用它们的时候能够互不影响,这也是策略模式与状态模式的区别所在,状态模式的子类之间有相互影响(因为要改变状态)。
/// <summary> /// 行程方案 /// </summary> public abstract class JourneyStrategy { public abstract void Show(); } /// <summary> /// 火车 /// </summary> public class TrainStrategy : JourneyStrategy { public override void Show() { Console.WriteLine("火车方案..."); } } /// <summary> /// 飞机 /// </summary> public class PlaneStrategy : JourneyStrategy { public override void Show() { Console.WriteLine("飞机方案..."); } } /// <summary> /// 汽车 /// </summary> public class BusStrategy : JourneyStrategy { public override void Show() { Console.WriteLine("汽车方案..."); } } /// <summary> /// 游客Context /// </summary> public class Tourist { public JourneyStrategy Strategy { get; set; } public void ShowStrategy() { Strategy.Show(); } } class Program { static void Main(string[] args) { Console.OutputEncoding = Encoding.UTF8; Tourist tourist = new Tourist(); tourist.Strategy = new PlaneStrategy(); tourist.ShowStrategy(); tourist.Strategy = new TrainStrategy(); tourist.ShowStrategy(); tourist.Strategy = new BusStrategy(); tourist.ShowStrategy(); Console.ReadKey(); } }
代码很简单,我觉得策略虽然利用了面向对象的优点,
但是也是有不足的地方,就是在客户端需要new出ConcreteStrategy。我觉得这样不太友好。耦合比较大,向客户端暴露了太多信息。
这也是策略模式与状态模式很重要的一个区别。状态模式不会暴露子类信息给客户端