【经典示例分享】— 商城购物车设计(VS+Access)附源码

弹指一挥间,从事开发工作两年多了,工作记录文件夹不知不觉好几G了。今天分享下之前项目中用到的一个购物车示例,虽然用的技术比较老(拖放控件DataGview),我觉得里面包含了很多可以细细咀嚼的面向对象思想,尤其是商品和购物车各个对象的从属关系。购物车老生常谈的东西,希望能起到抛砖引玉的效果。下面就简单介绍下吧!(via:女孩礼物网)

此款短小精悍的购物车主要有三大功能:1.折扣方案调整 2.商品列表 3.购物车

  1. 折扣方案调整
  1. 商品列表
  1. 购物车
  1. 购物车核心思想代码如下
复制代码
 1 using System;
 2 using System.Collections.Generic;
 3 
 4 [Serializable]
 5 public class Product {
 6 
 7     int id;
 8 
 9     public int Id {
10         get { return id; }
11         set { id = value; }
12     }
13 
14     string name;
15 
16     public string Name {
17         get { return name; }
18         set { name = value; }
19     }
20 
21     decimal price;
22 
23     public decimal Price {
24         get { return price; }
25         set { price = value; }
26     }
27 
28     string unit;
29 
30     public string Unit {
31         get { return unit; }
32         set { unit = value; }
33     }
34 
35     public Product(int id, string name, decimal price, string unit) {
36         this.id = id;
37         this.name = name;
38         this.price = price;
39         this.unit = unit;
40     }
41 }
复制代码

复制代码
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 
 6 [Serializable]
 7 public class ShopCartItem {
 8 
 9     private Product product;
10     private int count;
11 
12     public Product Product {
13         get { return product; }
14         set { product = value; }
15     }
16     public int Count {
17         get { return count; }
18         set { count = value; }
19     }
20 
21     /// <summary>
22     /// 单项总折后价。
23     /// </summary>
24     public decimal Price {
25         get {
26             decimal price = (decimal)0;
27             List<IDiscountable> discountsUsing = (List<IDiscountable>)HttpContext.Current.Application["DiscountsUsing"];
28             price = this.TotalPrice;
29             foreach (IDiscountable discount in discountsUsing) {
30                 price = price * (decimal)discount.GetDiscount(this.product.Price, this.count);
31             }
32             return price;
33         }
34     }
35 
36     /// <summary>
37     /// 单项总原价
38     /// </summary>
39     public decimal TotalPrice {
40         get{
41             return this.product.Price * this.count;
42         }
43     }
44 
45     public ShopCartItem(Product product, int count) {
46         this.product = product;
47         this.count = count;
48     }
49 }
复制代码

复制代码
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Web;
 5 
 6 [Serializable]
 7 public class ShopCartSet : IEnumerable<ShopCartItem> {
 8 
 9     private Dictionary<int, ShopCartItem> items;
10 
11     public ShopCartSet() {
12         this.items = new Dictionary<int, ShopCartItem>();
13     }
14 
15     /// <summary>
16     /// 各项总原价
17     /// </summary>
18     public decimal TotalPrice {
19         get {
20             decimal price = (decimal)0;
21             foreach (ShopCartItem item in this) {
22                 price = price + item.TotalPrice;
23             }
24             return price;
25         }
26     }
27 
28     /// <summary>
29     /// 各项总折后价
30     /// </summary>
31     public decimal Price {
32         get {
33             decimal price = (decimal)0;
34             foreach (ShopCartItem item in this) {
35                 price = price + item.Price;
36             }
37             return price;
38         }
39     }
40 
41     public ShopCartItem this[int id] {
42         get {
43             return this.items[id];
44         }
45         set {
46             this.items[id] = value;
47         }
48     }
49 
50     public void Add(Product product, int count) {
51         this.Add(new ShopCartItem(product, count));
52     }
53 
54     public void Add(ShopCartItem item) {
55         if (!this.items.ContainsKey(item.Product.Id)) {
56             this.items.Add(item.Product.Id, item);
57         }
58         else {
59             this.items[item.Product.Id].Count++;
60         }
61     }
62 
63     public void Remove(int key) {
64         this.items.Remove(key);
65     }
66 
67     public void Remove(Product product) {
68         this.items.Remove(product.Id);
69     }
70 
71     public void Remove(ShopCartItem shopCartItem) {
72         this.items.Remove(shopCartItem.Product.Id);
73     }
74 
75     #region 接口实现
76     public IEnumerator<ShopCartItem> GetEnumerator() {
77         return this.items.Values.GetEnumerator();
78     }
79 
80     System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() {
81         return this.items.Values.GetEnumerator();
82     }
83     #endregion
84 }
 1 using System;
 2 using System.Collections.Generic;
 3 
 4 [Serializable]
 5 public class Product {
 6 
 7     int id;
 8 
 9     public int Id {
10         get { return id; }
11         set { id = value; }
12     }
13 
14     string name;
15 
16     public string Name {
17         get { return name; }
18         set { name = value; }
19     }
20 
21     decimal price;
22 
23     public decimal Price {
24         get { return price; }
25         set { price = value; }
26     }
27 
28     string unit;
29 
30     public string Unit {
31         get { return unit; }
32         set { unit = value; }
33     }
34 
35     public Product(int id, string name, decimal price, string unit) {
36         this.id = id;
37         this.name = name;
38         this.price = price;
39         this.unit = unit;
40     }
41 }

源码下载

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏菩提树下的杨过

(Head First 设计模式)学习笔记(1)

把书中开篇duck问题的代码翻译成了c#版: 概述: 某游戏公司要设计一款鸭子的游戏,里面有各种各样的鸭子,有些会飞,有些会叫,但都会游泳。而且不同种类的鸭子...

2109
来自专栏Golang语言社区

厚土Go学习笔记 | 13. 用循环和函数 实现Sqrt(x)

利用前面学习的循环和函数,来实现 Sqrt(x)。并且与math.Sqrt(x)的结果做一下比较。 这个很有意思,所以,把中间不断带入的变化值都打印出来。 使用...

3586
来自专栏海说

JTable常见用法细则+设置某列可编辑+滚动表格

JTable常见用法细则 JTable是Swing编程中很常用的控件,这里总结了一些常用方法以备查阅.欢迎补充,转载请注明作者与出处. 一. 创建表...

4880
来自专栏木宛城主

曾经的代码系列——AJAX和JSON生成下拉列表框

代码测试使用 前台页面 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="GetGradeC...

1987
来自专栏菩提树下的杨过

如何给已经有数据的DataTable动态增加一列并赋值

以前手写sql的时代,我们经常用DataTable,自从用Linq后,很少用DataTable这些原始的东东了,近日在开发中遇到一些特殊情况,用户要求临时在显示...

2789
来自专栏菩提树下的杨过

几种常见复合sql查询语句的linq写法[继续补充中]

1.IN 语句 尝试了很多次,好象linq死活不生成in语句,无奈只能做了下变换 例,要找出"手机大类"以及"手机下属所有子类"的产品 (手机大类的ID为D0...

2476
来自专栏个人随笔

C#编写影院售票系统(A project with a higher amount of gold )(2:相关代码)

此篇文章为项目代码,,,需要项目需求 ,思路分析与窗体效果请访问:http://www.cnblogs.com/lsy131479/p/8367304.html...

3405
来自专栏菩提树下的杨过

.Net3.0中的自动属性(示例)

using System; namespace LinqDemo {     class Program     {         stat...

2038
来自专栏技术博客

字符串"2013/5/18 0:00:00”不是有效的 AllXsd 值

可以看到上述日期字符串当中18后面存在一个空格,就是这个空格导致的不是一个有效的AllXsd值。想让此字符串日期转换为有效的格式,可以用T来替换掉18后面的空格...

1703
来自专栏菩提树下的杨过

[基础]datagridview绑定数据源的几种常见方式

private void button1_Click(object sender, EventArgs e)         {             /...

2505

扫码关注云+社区

领取腾讯云代金券