• 设计模式之策略模式


    策略模式 类图

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

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

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

  • 相关阅读:
    六大设计原则
    spring的文件上传应用
    web项目的分页
    自己尝试写web,网页上点击链接没反应,没有发出http请求。
    python3.6使用chardet模块总是报错ValueError: Expected a bytes object, not a unicode object
    chardet模块的安装:检查编码类型
    decode,encode的用法
    转:Unicode,UTF-8,UTF-16,UTF-32,gb2312,gbk区别
    js赋值运算符 && 自增自减
    js算数运算符
  • 原文地址:https://www.cnblogs.com/hankuikui/p/7016392.html
Copyright © 2020-2023  润新知