zoukankan      html  css  js  c++  java
  • 使用策略设计模式,反射,解决商城系统中的商品折扣问题

      首先,我定义了一个接口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 }
  • 相关阅读:
    在CentOS-6.3环境下,利用grub工具手工制作Linux U盘安装盘
    Windowns DOS For 循环实例
    Bootstrap 标签的变体 实例样式
    Bootstrap两端对齐的导航实例
    bootstrap 分页样式代码
    C# 微信扫码支付API (微信扫码支付模式二)
    AjaxFileUpload 在C#中应用
    关于百度编辑器UEditor(1.4.3)在C#.NET中的应用实例
    电脑运行状态
    网络测试
  • 原文地址:https://www.cnblogs.com/liyonghui/p/2128925.html
Copyright © 2011-2022 走看看