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

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

相关文章

MyBatis-Plus逻辑删除实现过程

《MyBatis-Plus逻辑删除实现过程》本文介绍了MyBatis-Plus如何实现逻辑删除功能,包括自动填充字段、配置与实现步骤、常见应用场景,并展示了如何使用remove方法进行逻辑删除,逻辑删... 目录1. 逻辑删除的必要性编程1.1 逻辑删除的定义1.2 逻辑删php除的优点1.3 适用场景2.

C#借助Spire.XLS for .NET实现在Excel中添加文档属性

《C#借助Spire.XLSfor.NET实现在Excel中添加文档属性》在日常的数据处理和项目管理中,Excel文档扮演着举足轻重的角色,本文将深入探讨如何在C#中借助强大的第三方库Spire.... 目录为什么需要程序化添加Excel文档属性使用Spire.XLS for .NET库实现文档属性管理Sp

Python+FFmpeg实现视频自动化处理的完整指南

《Python+FFmpeg实现视频自动化处理的完整指南》本文总结了一套在Python中使用subprocess.run调用FFmpeg进行视频自动化处理的解决方案,涵盖了跨平台硬件加速、中间素材处理... 目录一、 跨平台硬件加速:统一接口设计1. 核心映射逻辑2. python 实现代码二、 中间素材处

Java数组动态扩容的实现示例

《Java数组动态扩容的实现示例》本文主要介绍了Java数组动态扩容的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1 问题2 方法3 结语1 问题实现动态的给数组添加元素效果,实现对数组扩容,原始数组使用静态分配

Python实现快速扫描目标主机的开放端口和服务

《Python实现快速扫描目标主机的开放端口和服务》这篇文章主要为大家详细介绍了如何使用Python编写一个功能强大的端口扫描器脚本,实现快速扫描目标主机的开放端口和服务,感兴趣的小伙伴可以了解下... 目录功能介绍场景应用1. 网络安全审计2. 系统管理维护3. 网络故障排查4. 合规性检查报错处理1.

Python轻松实现Word到Markdown的转换

《Python轻松实现Word到Markdown的转换》在文档管理、内容发布等场景中,将Word转换为Markdown格式是常见需求,本文将介绍如何使用FreeSpire.DocforPython实现... 目录一、工具简介二、核心转换实现1. 基础单文件转换2. 批量转换Word文件三、工具特性分析优点局

Springboot3统一返回类设计全过程(从问题到实现)

《Springboot3统一返回类设计全过程(从问题到实现)》文章介绍了如何在SpringBoot3中设计一个统一返回类,以实现前后端接口返回格式的一致性,该类包含状态码、描述信息、业务数据和时间戳,... 目录Spring Boot 3 统一返回类设计:从问题到实现一、核心需求:统一返回类要解决什么问题?

Java使用Spire.Doc for Java实现Word自动化插入图片

《Java使用Spire.DocforJava实现Word自动化插入图片》在日常工作中,Word文档是不可或缺的工具,而图片作为信息传达的重要载体,其在文档中的插入与布局显得尤为关键,下面我们就来... 目录1. Spire.Doc for Java库介绍与安装2. 使用特定的环绕方式插入图片3. 在指定位

Java使用Spire.Barcode for Java实现条形码生成与识别

《Java使用Spire.BarcodeforJava实现条形码生成与识别》在现代商业和技术领域,条形码无处不在,本教程将引导您深入了解如何在您的Java项目中利用Spire.Barcodefor... 目录1. Spire.Barcode for Java 简介与环境配置2. 使用 Spire.Barco

Java利用Spire.Doc for Java实现在模板的基础上创建Word文档

《Java利用Spire.DocforJava实现在模板的基础上创建Word文档》在日常开发中,我们经常需要根据特定数据动态生成Word文档,本文将深入探讨如何利用强大的Java库Spire.Do... 目录1. Spire.Doc for Java 库介绍与安装特点与优势Maven 依赖配置2. 通过替换