ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

策略模式

2022-07-21 15:02:20  阅读:130  来源: 互联网

标签:PromotionContext 策略 double 模式 算法 originPrice GetPrice public


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

什么是策略模式?

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

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

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

 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有