其他分享
首页 > 其他分享> > 策略模式

策略模式

作者:互联网

所谓设计模式,只不过是前人根据经验 总结得来的,归根结底还是基于 面向对象的!

什么是策略模式?

名词分析法:什么是策略?根据形势而确定的原则和方法,这是百度词条收到的,程序设计理念其实也就是这个意思。

  比如,商场,网吧等打折,满减 促销,这样同样的商品价格就会根据促销方式 有不同的计算方法!我们直接上个例子

  首先定义一个策略接口,因为既然是策略,那么肯定是基于一定的编程基础,进行算法的变化即可。这样的话,算法的名字先用接口规定好

 public interface IStrategyModul 
    {
        /// <summary>
        /// 根据原价 和策略计算新价格
        /// </summary>
        /// <param name="originPrice">原价</param>
        /// <returns></returns>
        double GetPrice(double originPrice);
    }

  具体算法也就是实际算法类,我们先列举2个

 //打折类
    public class Discount : IStrategyModul
    {
        public double DiscountMoney { get; set; }
        public Discount(double discount) 
        {
            this.DiscountMoney = discount;
         }
        public double GetPrice(double originPrice)
        {
            return DiscountMoney * originPrice;//应付多少钱
        }
    }

    //返现类
    public class MoneyBack : IStrategyModul
    {
        public double ManE { get; set; }//满额多少开始返钱
        public double ReMoney { get; set; }//返多少
        public MoneyBack(double mane,double remoney) 
        {
            this.ManE = mane;
            this.ReMoney = remoney;
        }
        public double GetPrice(double originPrice)
        {
            if (originPrice<ManE)
            {
                Console.WriteLine("未能达到返现资格,不然再挑选几件称心的商品吧");
                return 0;
            }
            var result = originPrice - (int)(originPrice / ManE) * ReMoney;
            return result;  //应付多少钱
        }
    }

那么,我们客户端怎么去调用这些算法呐?如何根据实际情况进行算法的切换呐?

我们这时候需要一个上下文类,即承上启下  的类,去进行沟通交流

public class PromotionContext 
    {
        private IPromotion _p = null;
        public PromotionContext(IPromotion p)        
        {
            this._p = p;
        }
        public double GetPrice(double originPrice)
        {
            if (this._p==null)
            {
                Console.WriteLine("最近暂时无促销活动哦!!!");
                return originPrice;
            }
            return _p.GetPrice(originPrice);//否则返回 活动 后应该付的钱
        }
    }

这样在客户端只需要对上下文类做相应的 算法初始化即可!

 #region   策略模式
            Console.WriteLine("请输入金额");
            var money = Console.ReadLine();
            //打折促销  打7折
            PromotionContext context = new PromotionContext(new Discount(0.7));
            var res = context.GetPrice(double.Parse(money));
            Console.WriteLine($"打折后,您应付¥{res}");

       //满200 减60 PromotionContext context1 = new PromotionContext(new MoneyBack(200, 60)); var res1 = context1.GetPrice(double.Parse(money)); Console.WriteLine($"满减后,您应付¥{res1}"); #endregion

 

 

标签:PromotionContext,策略,double,模式,算法,originPrice,GetPrice,public
来源: https://www.cnblogs.com/messi-10/p/16501917.html