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 }
  • 相关阅读:
    解决 id_rsa 权限不够
    ubuntu卸载python3
    压缩go build打包的可执行文件
    Linux :scp 远程文件拷贝命令
    ubuntu 下彻底卸载 vim 并重新安装
    HDU2296——Ring(AC自动机+DP)
    POJ2778&HDU2243&POJ1625(AC自动机+矩阵/DP)
    AC自动机
    【扯】2016618
    POJ 3419 Difference Is Beautiful(RMQ变形)
  • 原文地址:https://www.cnblogs.com/liyonghui/p/2128925.html
Copyright © 2011-2022 走看看