在前的文章里面,我谈到了关于商城中商品类别设计的相关内容,今天我再谈谈关于商品打折的问题,在一个商城系统里,商家为了促销会使用一些促销的手段,打折就是其中之一,而打折又有很多种,比如打65折、满10010元等等,如果一股脑把这些业务逻辑写死在程序里面,那么日后想更新或者增加新的促销手段将是非常困难的,要知道一个商城系统之庞大,轻易是不能改代码的。所以为了解决这个问题,牛人前辈们提出了策略的设计模式,具体什么是策略模式这里就不讲了,这里只讲它的一个应用的实例,即根据不同的折扣算法计算商品打折后的价格。

    首先,我定义了一个接口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 }

执行测试的结果如下:

如下是使用java代码实现,只提供DiscountContext类的实现,其余的类同上。

 1 public class DiscountContext {
2 private DiscountContext() {
3 }
4
5 /**
6 * 根据折扣名称和商品原价获取打折后的价格
7 *
8 * @param discount
9 * 折扣名称
10 * @param originalPrice
11 * 商品原价
12 * @return
13 */
14 public static double getDiscount(String discount, double originalPrice) {
15 try {
16 String packageName = DiscountContext.class.getPackage().getName();
17 Class<?> assembly = Class.forName(packageName + "." + discount);
18 IStrategy instance = (IStrategy) assembly.newInstance();
19 if(instance!=null){
20 return instance.getDiscount(originalPrice);
21 }
22 } catch (Exception e) {
23 e.printStackTrace();
24 }
25 return originalPrice;
26 }
27 }

 

作者: 海岛孤雁 发表于 2011-07-31 01:02 原文链接

推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架
新浪微博粉丝精灵,刷粉丝、刷评论、刷转发、企业商家微博营销必备工具"