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

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

  • 相关阅读:
    zabbix监控之zabbix-agent被动变为主动,搭建Proxy代理
    zabbix监控nginx,mysql,java
    浅谈 HTTP协议
    ELK实时日志分析平台环境部署,以及可视化展示
    Shell脚本中$0、$?、$!、$$、$*、$#、$@的意义
    mfs分布式文件系统,分布式存储,高可用(pacemaker+corosync+pcs),磁盘共享(iscsi),fence解决脑裂问题
    Centos 或者 Redhat修改系统时间
    HTTPS加密协议过程
    实现mysql的读写分离(mysql-proxy)____1(mysql的主从复制,基于gtid的主从复制,半同步复制,组复制)
    实现mysql的读写分离(mysql-proxy)____2
  • 原文地址:https://www.cnblogs.com/hankuikui/p/7016392.html
Copyright © 2011-2022 走看看