商品价格加价区间的实现(策略模式)

2023-10-27 22:40

本文主要是介绍商品价格加价区间的实现(策略模式),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言:

好久之前,某个网友提的需求,对商品进行加价,根据原商品的价格不同,加价的方式不同。

具体如下:

250元以下 按比率10%以内加价
251~500 加价 25元以下
501~5000  按比率 5%以内加价
5000以上 加价250元以下
比如某种商品价格是:6000或者10000按照5000元以上的标准调。

分析:

首先,加价是一个范围,因此我们先定义一个结构,PriceRange:

1 public struct PriceRange
2     {
3         public decimal MaxPrice { get; set; }
4         public decimal MinPrice { get; set; }
5     }

对于加价相关的逻辑,有两种,一种为固定加价,一种为按比率加价,因此利用策略模式处理如下(英文类名请无视,硬伤):

 1  public interface IPriceStrategy
 2     {
 3         PriceRange GetPriceRange(decimal purchasePrice);
 4     }
 5 
 6     /// <summary>
 7     /// 固定加价策略
 8     /// </summary>
 9     public class FixedPriceStrategy : IPriceStrategy
10     {
11         private decimal _fixedPrice;
12 
13         /// <summary>
14         /// 
15         /// </summary>
16         /// <param name="fixedPrice">加价金额</param>
17         public FixedPriceStrategy(decimal fixedPrice)
18         {
19             this._fixedPrice = fixedPrice;
20         }
21 
22         public PriceRange GetPriceRange(decimal purchasePrice)
23         {
24             return new PriceRange()
25             {
26                 MinPrice = purchasePrice,
27                 MaxPrice = purchasePrice + _fixedPrice,
28             };
29         }
30     }
31 
32     /// <summary>
33     /// 百分比加价策略
34     /// </summary>
35     public class PercentagePriceStrategy : IPriceStrategy
36     {
37         private decimal _percent;
38 
39         /// <summary>
40         /// 
41         /// </summary>
42         /// <param name="percent">加价率</param>
43         public PercentagePriceStrategy(decimal percent)
44         {
45             this._percent = percent;
46         }
47 
48         public PriceRange GetPriceRange(decimal purchasePrice)
49         {
50             return new PriceRange()
51             {
52                 MinPrice = purchasePrice,
53                 MaxPrice = purchasePrice * (1 + _percent),
54             };
55         }
56     }

最后需要一个工具类,封装相关加价逻辑,并暴漏一个方法出来:

PS:这里设计:每种加价策略的低价作为key,放到字典中。 获取加价区间时,取小于或等于 传入价格的所有Key中最大的一个(如果没有,则取最大的Key),即为最终的加价策略!

这样设计的好处:可以避免大量的if 和else if 。。。

 1 public class PriceUtility
 2     {
 3         /// <summary>
 4         /// 相关加价策略
 5         /// </summary>
 6         private static Dictionary<decimal, IPriceStrategy> Dic = new Dictionary<decimal, IPriceStrategy>();
 7 
 8         static PriceUtility()
 9         {
10             //初始化加价规则(todo:这里是写死的,如果需求多变,也可以从外部存储获取并初始化)
11             Dic.Add(0, new PercentagePriceStrategy(0.1m));
12             Dic.Add(250, new FixedPriceStrategy(25));
13             Dic.Add(500, new PercentagePriceStrategy(0.05m));
14             Dic.Add(5000, new FixedPriceStrategy(250));
15         }
16 
17         /// <summary>
18         /// 获取加价区间
19         /// </summary>
20         /// <param name="purchasePrice"></param>
21         /// <returns></returns>
22         public static PriceRange GetRange(decimal purchasePrice)
23         {
24             var key = GetCurrentKey(purchasePrice);
25 
26             return Dic[key].GetPriceRange(purchasePrice);
27         }
28 
29         /// <summary>
30         /// 获取符合条件的Key
31         /// </summary>
32         /// <param name="purchasePrice"></param>
33         /// <returns></returns>
34         private static decimal GetCurrentKey(decimal purchasePrice)
35         {
36             //找到小于等于该价格的所有Key
37             var keys = Dic.Keys.Where(r => r.CompareTo(purchasePrice) <= 0).ToArray();
38             //如果没有,则取最大的
39             if (keys.Length == 0) return Dic.Keys.Max();
40             //有则在找到的Key中取最大的
41             return keys.Max();
42         }
43     }

结果:

用控制台应用程序测试一下:

 1 static void Main(string[] args)
 2         {
 3             ConsolePriceRange(100);
 4             ConsolePriceRange(240);
 5             ConsolePriceRange(250);
 6             ConsolePriceRange(490);
 7             ConsolePriceRange(500);
 8             ConsolePriceRange(4900);
 9             ConsolePriceRange(5000);
10             ConsolePriceRange(10000);
11 
12             Console.ReadKey();
13         }
14 
15         static void ConsolePriceRange(decimal price)
16         {
17             PriceRange range = PriceUtility.GetRange(price);
18 
19             Console.WriteLine("产品价格{0}的加价区间为:{1}~{2}", price, range.MinPrice, range.MaxPrice);
20         }

转载于:https://www.cnblogs.com/hetring/p/4992474.html

这篇关于商品价格加价区间的实现(策略模式)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/288895

相关文章

springMVC返回Http响应的实现

《springMVC返回Http响应的实现》本文主要介绍了在SpringBoot中使用@Controller、@ResponseBody和@RestController注解进行HTTP响应返回的方法,... 目录一、返回页面二、@Controller和@ResponseBody与RestController

nginx中重定向的实现

《nginx中重定向的实现》本文主要介绍了Nginx中location匹配和rewrite重定向的规则与应用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下... 目录一、location1、 location匹配2、 location匹配的分类2.1 精确匹配2

Nginx之upstream被动式重试机制的实现

《Nginx之upstream被动式重试机制的实现》本文主要介绍了Nginx之upstream被动式重试机制的实现,可以通过proxy_next_upstream来自定义配置,具有一定的参考价值,感兴... 目录默认错误选择定义错误指令配置proxy_next_upstreamproxy_next_upst

nginx生成自签名SSL证书配置HTTPS的实现

《nginx生成自签名SSL证书配置HTTPS的实现》本文主要介绍在Nginx中生成自签名SSL证书并配置HTTPS,包括安装Nginx、创建证书、配置证书以及测试访问,具有一定的参考价值,感兴趣的可... 目录一、安装nginx二、创建证书三、配置证书并验证四、测试一、安装nginxnginx必须有"-

Spring Retry 实现乐观锁重试实践记录

《SpringRetry实现乐观锁重试实践记录》本文介绍了在秒杀商品SKU表中使用乐观锁和MybatisPlus配置乐观锁的方法,并分析了测试环境和生产环境的隔离级别对乐观锁的影响,通过简单验证,... 目录一、场景分析 二、简单验证 2.1、可重复读 2.2、读已提交 三、最佳实践 3.1、配置重试模板

Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)

《Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)》文章介绍了如何使用dhtmlx-gantt组件来实现公司的甘特图需求,并提供了一个简单的Vue组件示例,文章还分享了一... 目录一、首先 npm 安装插件二、创建一个vue组件三、业务页面内 引用自定义组件:四、dhtmlx

Vue ElementUI中Upload组件批量上传的实现代码

《VueElementUI中Upload组件批量上传的实现代码》ElementUI中Upload组件批量上传通过获取upload组件的DOM、文件、上传地址和数据,封装uploadFiles方法,使... ElementUI中Upload组件如何批量上传首先就是upload组件 <el-upl

Docker部署Jenkins持续集成(CI)工具的实现

《Docker部署Jenkins持续集成(CI)工具的实现》Jenkins是一个流行的开源自动化工具,广泛应用于持续集成(CI)和持续交付(CD)的环境中,本文介绍了使用Docker部署Jenkins... 目录前言一、准备工作二、设置变量和目录结构三、配置 docker 权限和网络四、启动 Jenkins

Python3脚本实现Excel与TXT的智能转换

《Python3脚本实现Excel与TXT的智能转换》在数据处理的日常工作中,我们经常需要将Excel中的结构化数据转换为其他格式,本文将使用Python3实现Excel与TXT的智能转换,需要的可以... 目录场景应用:为什么需要这种转换技术解析:代码实现详解核心代码展示改进点说明实战演练:从Excel到

如何使用CSS3实现波浪式图片墙

《如何使用CSS3实现波浪式图片墙》:本文主要介绍了如何使用CSS3的transform属性和动画技巧实现波浪式图片墙,通过设置图片的垂直偏移量,并使用动画使其周期性地改变位置,可以创建出动态且具有波浪效果的图片墙,同时,还强调了响应式设计的重要性,以确保图片墙在不同设备上都能良好显示,详细内容请阅读本文,希望能对你有所帮助...