dotNET.NETASP.NET Core见识录

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

2019-11-06  本文已影响0人  Carson_jz

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

上一篇 下一篇

猜你喜欢

热点阅读