设计模式之策略模式

策略模式 类图

 

策略模式很好的诠释了面向对象的三大特征:

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。我觉得这样不太友好。耦合比较大,向客户端暴露了太多信息。

这也是策略模式与状态模式很重要的一个区别。状态模式不会暴露子类信息给客户端

posted @ 2017-06-15 16:44  二奎  阅读(181)  评论(0编辑  收藏  举报