zoukankan      html  css  js  c++  java
  • 设计模式之策略模式

    策略模式 类图

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

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

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

  • 相关阅读:
    [可能没有默认的字体]Warning: imagettfbbox() [function.imagettfbbox]: Invalid font filename...
    <yii 框架学习> yii 框架改为中文提示
    Yii 语言设置 中文提示信息
    yii新手在实例化models(controller调用models实化化)php warning错误
    yii CFormModel中的rules验证机制
    神舟优雅系列和神舟精盾系列哪个好?
    response.sendRedirect跳转 jsp:forward跳转
    jsp post/get中接处理
    jsp动作之 forward
    JDK eclipse selenium的安装以及环境变量的配置
  • 原文地址:https://www.cnblogs.com/hankuikui/p/7016392.html
Copyright © 2011-2022 走看看