• C# 设计模式-策略模式


    一.介绍  

      策略模式(Stragety Pattern)。属于行为型模式。它定义了算法(行为)家族,分别封装起来,使得它们之间可以相互替换,此模型让算法(行为)的变化,不会影响到使用该算法(行为)的客户。

    二.实现

      举个例子,一辆车(Car类)里有轮胎(Tyre类)才能跑(Run),不同情况需要使用不同的轮胎,可以在Run方法里根据if/else去使用不同的轮胎(创建对象),但如果以后情况越来越多,需要的轮胎种类越来越多,就得频繁修改Run方法,这就违反了开闭原则。

      又或者说,在同一个轮胎里根据不同情况实现不同功能,但这都有可能需要进行多次修改,同样违反开闭原则。

      所以,这种情况就可以使用策略模式。

    //环境角色(Context)
    public class Car
    {
        Tyre tyre;
    
        public void SetTyre(Tyre tyre)
        {
            this.tyre = tyre;
        }
    
        public void Run()
        {
            if (tyre != null)
            {
                Console.WriteLine(tyre.SetKind() + "");
            }
            else
            {
                Console.WriteLine("没轮胎跑不了");
            }
        }
    }
    
    //抽象策略角色(Strategy)
    public abstract class Tyre
    {
        public abstract string SetKind();
    }
    
    //具体策略角色(ConcreteStrategy)
    public class CommonTyre : Tyre
    {
        public override string SetKind()
        {
            return "用普通轮胎";
        }
    }
    
    //具体策略角色(ConcreteStrategy)
    public class RainTyre : Tyre
    {
        public override string SetKind()
        {
            return "用雨胎";
        }
    }
    
    //调用
    public static void Main(string[] args)
    {
        Car c = new Car();
        //普通情况,装普通轮胎跑
        c.SetTyre(new CommonTyre());
        c.Run();
        //下雨了,装雨胎
        c.SetTyre(new RainTyre());
        c.Run();
    }

      在策略模式下,它将Tyre对象的创建放在了外部,根据不同情况再把不同Tyre对象传到Car对象里,使得Car类不依赖于Tyre类,高层和底层解耦,其实该模式就是符合依赖倒置的设计原则。

    三.总结

      优点:

      1.由于轮胎(策略类)都使用同一个接口,使得它们可以自由切换。

      2.易于拓展。新增一个轮胎(策略类)只需要添加一个新的具体轮胎(策略类)就行,基本不需要修改原有代码。

      3.避免使用多重条件选择语句,充分体现出面向对象的思想。

      缺点:

      1.客户端必须知道所有的轮胎(策略类),并决定使用哪一个轮胎(策略类)。

      2.策略模式会造成有多个策略类。

  • 相关阅读:
    java通过UUID生成16位唯一订单号
    spring framework体系结构及内部各模块jar之间的maven依赖关系
    Java操作PDF之iText超入门
    对象拷贝
    Alluxio 1.5集群搭建
    InfluxDb中写入重复数据问题解决方案
    苹果笔记本中为虚拟机扩充硬盘的方法
    Grafana中整个Dashboard报错问题解决
    使用WebEx录制视频并转换为MP4
    Spark配置参数优先级
  • 原文地址:https://www.cnblogs.com/shadoll/p/14323683.html
Copyright © 2020-2023  润新知