使用策略设计模式,反射,解决商城系统中的商品折扣问题

  首先,我定义了一个接口IStrategy,这个接口提供一个获取折扣后价格的规范,方法签名为:double GetDiscount(double originalPrice);

然后,我写了两个IStrategy的实现类,分别作为两种不同的打折方案。

打折方案一:半价折扣

 1  /// <summary>
2 /// 打折方案1
3 /// </summary>
4 public class DiscountSlnOne : IStrategy
5 {
6 /// <summary>
7 /// 半价折扣
8 /// </summary>
9 /// <param name="originalPrice">商品原价</param>
10 /// <returns>返回打折后的商品价格</returns>
11 public double GetDisCount(double originalPrice)
12 {
13 return originalPrice * 0.5;
14 }
15 }

打折方案二:满100元送10元

 1  /// <summary>
2 /// 打折方案2
3 /// </summary>
4 public class DiscountSlnTwo : IStrategy
5 {
6 /// <summary>
7 /// 满100元送10元
8 /// </summary>
9 /// <param name="originalPrice">商品原价</param>
10 /// <returns>返回打折后的商品价格</returns>
11 public double GetDisCount(double originalPrice)
12 {
13 return originalPrice >= 100 ? (originalPrice - 10) : originalPrice;
14 }
15 }

最后还有一个折扣的决策类,根据不同的折扣选择不同的折扣算法。

 1  /// <summary>
2 /// 折扣信息决策类,根据不同的折扣选择不同的折扣算法
3 /// </summary>
4 public class DiscountContext
5 {
6 private DiscountContext() { }
7
8 /// <summary>
9 /// 根据指定的折扣名称和商品原价获取打折后的价格
10 /// </summary>
11 /// <param name="discout">折扣名称</param>
12 /// <param name="originalPrice">商品原价</param>
13 /// <returns>返回打折后的商品价格</returns>
14 public static double GetDiscount(string discout, double originalPrice)
15 {
16 Assembly assembly = Assembly.Load(typeof(DiscountContext).Assembly.FullName);
17 //获取命名空间名称
18 string nameSpaceString = typeof(DiscountContext).Namespace;
19 string instanceFullName = nameSpaceString + "." + discout;
20 //使用反射创建指定折扣的实例
21 IStrategy instance = assembly.CreateInstance(instanceFullName) as IStrategy;
22 if (instance != null)
23 {
24 return instance.GetDisCount(originalPrice);
25 }
26 return originalPrice;
27 }
28 }

下面从控制台下测试,代码如下:

 1  class Program
2 {
3 static void Main(string[] args)
4 {
5 //下面这个商品列表用来模拟从数据库中查询到的商品数据
6 List<Product> productList = new List<Product>();
7 productList.Add(new Product()
8 {
9 ProductId = "10001",
10 ProductName = "杜蕾斯",
11 Price = 40.5,
12 Discount = "DiscountSlnOne"
13 });
14 productList.Add(new Product()
15 {
16 ProductId = "10002",
17 ProductName = "印度神油",
18 Price = 130.5,
19 Discount = "DiscountSlnTwo"
20 });
21
22
23 Console.WriteLine("==========================商品打折结果===========================");
24 foreach (Product p in productList)
25 {
26 Console.WriteLine("商品“ {0} ”按照方案“ {1} ”打折后的价格为:{2:c}", p.ProductName, p.Discount, DiscountContext.GetDiscount(p.Discount, p.Price));
27 }
28
29 Console.ReadKey();
30 }
31 }
原文地址:https://www.cnblogs.com/liyonghui/p/2128925.html