美文网首页dotNET.NETASP.NET Core见识录
策略模式-如何利依赖注入运行时切换方法

策略模式-如何利依赖注入运行时切换方法

作者: Carson_jz | 来源:发表于2019-11-06 21:51 被阅读0次

    概要:干同一件事情,但是根据不同情况有不同做法,我们可以从中提炼出一个动作的抽象,然后用不同的类去实现它,可以随时替换。那样使用这个动作抽象的具体业务就不需要关心他如何实现。设计模式Github源码

    我们拿不同时期下单优惠策略不同来讲述策略模式的用法。

    IStrategy:策略的抽象接口,定义出行为的抽象

    Strategy:具体策略,继承IStrategy,负责实现,Strategy可以有很多个,全部都继承IStrategy。

    ActivitiesContext:策略上下文,这个用来控制什么时候用什么策略实现的,当然如果用依赖注入可以不需要这个,在注入时候决定注入哪个方法,策略上下文是负责调度的。

    引用关系:

    Strategy : IStrategy

    ActivitiesContext : IStrategy

    看最后面的代码,策略模式的很普通用法,但有时候满足不了我们需求,我们需要把依赖注入结合进去,在代码里随时控制具体实现使用哪个类

    image.png

    如何实现同一个接口可以动态调用不同实例

    https://www.jianshu.com/p/b25fb6159290

    using System;
    
    namespace Strategy
    {
        /// <summary>
        /// 策略接口
        /// </summary>
        public interface IActivitiesStrategy
        {
            /// <summary>
            /// 获取则扣策略
            /// </summary>
            /// <returns></returns>
            double GetDiscountStrategy();
        }
    
        /// <summary>
        /// 策略上下文
        /// </summary>
        public class ActivitiesContext
        {
            private readonly IActivitiesStrategy _activitiesStrategy;
            public ActivitiesContext(IActivitiesStrategy activitiesStrategy)
            {
                _activitiesStrategy = activitiesStrategy;
            }
    
            public double GetActivitiesDiscount()
            {
                return _activitiesStrategy.GetDiscountStrategy();
            }
        }
    
        public class Activities
        {
            /// <summary>
            /// 折扣
            /// </summary>
            public double Discount { get; set; }
        }
    
        public class DoubleElevenActivities : IActivitiesStrategy
        {
            public double GetDiscountStrategy()
            {
                return 0.11;
            }
        }
    
        public class DoubleTwelveActivities : IActivitiesStrategy
        {
            public double GetDiscountStrategy()
            {
                return 0.12;
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                ActivitiesContext context = new ActivitiesContext(new DoubleElevenActivities());
                Console.WriteLine("Hello World!");
            }
        }
    }
    
    

    相关文章

      网友评论

        本文标题:策略模式-如何利依赖注入运行时切换方法

        本文链接:https://www.haomeiwen.com/subject/elvpbctx.html