綜合實戰:超市收銀系統設計模式
分析系統需求
超市提供的商品:筆記本電腦、手機、醬油、香蕉
商品在超市裏面應該有:價格、數量、編號
這樣就能抽象出來一個父類(ProductFather),包含價格(Price)、數量(Count)、編號(ID)ide
若是東西不夠賣了,須要到倉庫拿貨物
倉庫須要的功能:存儲貨物、提貨、進貨函數
超市賣東西時候須要一個收銀的功能ui
抽象出一個商品的父類this
class ProductFather { public decimal Price { get; set; } public double Count { get; set; } public string ID { get; set; } public ProductFather(string id, decimal price, double count) { this.ID = id; this.Price = price; this.Count = count; } }
分別建立商品類繼承於父類spa
class ShouJi:ProductFather { public ShouJi(string id, decimal price, double count) : base(id, price, count) { } }
建立倉庫類設計
class CangKu
{
//1.存儲貨物
//1.1 list至關於倉庫,List<ProductFather>添加數據的集合,至關於將貨架放到倉庫,從而分門別類
List<List<ProductFather>> list = new List<List<ProductFather>>();code
/// <summary> /// 想用戶展現貨物 /// </summary> public void ShowPros() { foreach (var item in list) { Console.WriteLine("倉庫有:" + item[0].Name + "," + "\t" + "有" + item.Count + "個," + "\t" + "每一個" + item[0].Price + "元。"); } } /// <summary> /// 建立倉庫對象時,向倉庫中添加貨架 /// </summary> //list[0] 存電腦 list[1]存手機 list[2]存醬油 list[3]存香蕉,這時候若是多,就能經過循環來完成 public CangKu() { list.Add(new List<ProductFather>()); list.Add(new List<ProductFather>()); list.Add(new List<ProductFather>()); list.Add(new List<ProductFather>()); } /// <summary> /// 進貨 /// </summary> /// <param name="strType">貨物的類型</param> /// <param name="count">貨物的數量</param> public void GetPros(string strType,int count) { for (int i = 0; i < count; i++) { switch (strType) { case "NoteBook": list[0].Add(new NoteBook(Guid.NewGuid().ToString(), 5000, "筆記本電腦")); break; case "ShouJi":list[1].Add(new ShouJi(Guid.NewGuid().ToString(), 3000, "手機")); break; case "JiangYou":list[2].Add(new JiangYou(Guid.NewGuid().ToString(), 10, "醬油")); break; case "Banana":list[3].Add(new Banana(Guid.NewGuid().ToString(), 20, "香蕉")); break; } } } /// <summary> /// 取貨 /// </summary> /// <param name="strType">貨物的類型</param> /// <param name="count">貨物的數量</param> //貨物取出後,須要放哪?並且有可能會拿不少個因此返回ProductFather[] public ProductFather[] QuPros(string strType, int count) { ProductFather[] pros = new ProductFather[count]; for (int i = 0; i < count; i++) { switch (strType) { case "NoteBook": if (list[0].Count == 0) { Console.WriteLine("沒有電腦了!"); } else { pros[i] = list[0][0]; list[0].RemoveAt(0); } break; case "ShouJi": if (list[1].Count == 0) { Console.WriteLine("沒有手機了!"); } else { pros[i] = list[1][0]; list[1].RemoveAt(0); } break; case "JiangYou": if (list[2].Count == 0) { Console.WriteLine("沒有醬油了!"); } else { pros[i] = list[2][0]; list[2].RemoveAt(0); } break; case "Banana": if (list[3].Count == 0) { Console.WriteLine("沒有醬油了!"); } else { pros[i] = list[3][0]; list[3].RemoveAt(0); } break; } } return pros; } }
超市收銀系統續
建立超市類orm
namespace 超市收銀系統 { class SuperMarket { ////當用戶進入超市後,倉庫應該有東西,可是作完倉庫類後依然沒有貨,建立倉庫對象經過構造函數給予倉庫貨 CangKu ck = new CangKu(); /// <summary> /// 建立超市對象的時候,給倉庫的貨架上導入貨物 /// </summary> public SuperMarket() { ck.GetPros("ShouJi", 1000); ck.GetPros("NoteBook", 1000); ck.GetPros("JiangYou", 1000); ck.GetPros("banana", 1000); } /// <summary> /// 跟客戶交互的過程(問客戶買什麼) /// </summary> public void AskBuying() { Console.WriteLine("歡迎光臨,請問您須要些什麼"); Console.WriteLine("咱們這裏有筆記本電腦(NoteBook)、手機(ShouJi)、醬油(JiangYou)、香蕉(Banana)"); string strType = Console.ReadLine(); Console.WriteLine("您須要多少?"); int count = Convert.ToInt32(Console.ReadLine()); //去倉庫取貨 ProductFather[] pros = ck.QuPros(strType, count); //取貨後,計算價錢,寫一個方法,計算總價錢 double realMoney = GetMoney(pros); Console.WriteLine("您購買的商品,總價是{0}元", realMoney); //打折方式 Console.WriteLine("您購買的商品,總價是{0}元", realMoney); Console.WriteLine("請選擇你的打折方式 1--不打折 2--打九折 3--打85折 4--買300送50 5--買500送100"); string input = Console.ReadLine(); } /// <summary> /// 根據用戶買的貨物計算總價錢 /// </summary> /// <param name="pros">用戶購買的貨物</param> /// <returns></returns> public double GetMoney(ProductFather[] pros) { //聲明一個總價錢 double realMoney = 0; for (int i = 0; i < pros.Length; i++) { //表示把這個集合當每一個貨物的價錢累加到總價上 realMoney += pros[i].Price; } return realMoney; } }
}對象
打折方式的類建立
因爲打折也是不固定沒,沒有能夠直接實現的對象,因此這時就能夠採用一個抽象類來實現
建立打折類的父類
namespace 超市收銀系統 { /// <summary> /// 打折的父類 /// </summary> abstract class CalFather { /// <summary> /// 計算打折後應付多少錢 /// </summary> /// <param name="realMoney">打折前應付的錢</param> /// <returns>返回打折後的錢</returns> public abstract double GetTotalMoney(double realMoney); } }
有了打折類父類以後,按照需求瞭解到,有三種打折模式1.不打折 2.按照折扣打折 3.買多少送多少。先建立一個不打折的類
namespace 超市收銀系統 { /// <summary> /// 不打折,該多少錢就是多少錢 /// </summary> class CalNormal : CalFather { public override double GetTotalMoney(double realMoney) { return realMoney; } } }
而後在建立一個按照折扣率打折的類
namespace 超市收銀系統 { /// <summary> /// 按照折扣率打折 /// </summary> class CalRate : CalFather { /// <summary> /// 折扣率,因爲天天的折扣率都不同,因此須要一個屬性來存摺扣率 /// </summary> public double Rate { get; set; } //當建立對象的時候傳入折扣率 public CalRate(double reta) { this.Rate = reta; } public override double GetTotalMoney(double realMoney) { return realMoney * this.Rate; } } }
最後建立一個買多少送多少的類
namespace 超市收銀系統 { /// <summary> /// 買M元 送N元 /// </summary> class CalMN : CalFather { //買多少送多少 public double M //買的錢 { get; set; } public double N //送的錢 { get; set; } public CalMN(double m, double n) //經過構造函數把值賦值給屬性 { this.M = m; this.N = n; } /// <summary> /// 判斷買多少錢(M)送多少錢(N) /// </summary> /// <param name="realMoney">買的多少錢</param> /// <returns>返回送錢後的應該付多少錢</returns> public override double GetTotalMoney(double realMoney) { if (realMoney >= this.M) { //此時存在一個問題,若是用戶購買1000呢?送不送就得送兩個100元。 //return realMoney - this.N; //打折多少取決於有幾個M,這樣就拿到了幾個M,因爲realMoney是double類型,因此須要強轉成int整數型 return realMoney - (int)(realMoney/this.M)*this.N; } else { return realMoney; } } } }
至此超市打折的步驟完成
這時候咱們實際是不知道用戶會選擇哪一種打折模式的,這時候就用到了簡單工廠設計模式,根據用戶輸入來返回一個對象。
因爲不肯定用戶的選擇,因此也不能肯定返回哪一個子類,可是返回父類是確定不會錯的。
獲取用戶選擇的打折模式,來給出價錢
class SuperMarket { //當用戶進入超市後,倉庫應該有東西,可是作完倉庫類後依然沒有貨,建立倉庫對象經過構造函數給予倉庫貨 CangKu ck = new CangKu(); /// <summary> /// 建立超市對象的時候,給倉庫的貨架上導入貨物 /// </summary> public SuperMarket() { ck.GetPros("ShouJi", 1000); ck.GetPros("NoteBook", 1000); ck.GetPros("JiangYou", 1000); ck.GetPros("banana", 1000); } /// <summary> /// 跟客戶交互的過程(問客戶買什麼) /// </summary> public void AskBuying() { Console.WriteLine("歡迎光臨,請問您須要些什麼"); Console.WriteLine("咱們這裏有筆記本電腦(NoteBook)、手機(ShouJi)、醬油(JiangYou)、香蕉(Banana)"); string strType = Console.ReadLine(); Console.WriteLine("您須要多少?"); int count = Convert.ToInt32(Console.ReadLine()); //去倉庫取貨 ProductFather[] pros = ck.QuPros(strType, count); //取貨後,計算價錢,寫一個方法,計算總價錢 double realMoney = GetMoney(pros); //打折方式 Console.WriteLine("您購買的商品,總價是{0}元", realMoney); Console.WriteLine("請選擇你的打折方式 1--不打折 2--打九折 3--打85折 4--買300送50 5--買500送100"); string input = Console.ReadLine(); //經過簡單工廠設計模式根據用戶的輸入得到一個打折對象 CalFather cal = GetCal(input); double totalMoney = cal.GetTotalMoney(realMoney); Console.WriteLine("打完折後,您應付{0}元", totalMoney); } /// <summary> /// 根據用戶選擇的打折方式返回一個打折對象 /// </summary> /// <param name="input">用戶的選擇</param> /// <returns>返回父類的對象,可是裏面裝的是子類對象</returns> public CalFather GetCal(string input) { CalFather cal = null; switch (input) { case "1": cal = new CalNormal(); break; case "2": cal = new CalRate(0.9); break; case "3": cal = new CalRate(0.85); break; case "4": cal = new CalMN(300, 50); break; case "5": cal = new CalMN(500, 100); break; } return cal; } /// <summary> /// 根據用戶買的貨物計算總價錢 /// </summary> /// <param name="pros">用戶購買的貨物</param> /// <returns></returns> public double GetMoney(ProductFather[] pros) { //聲明一個總價錢 double realMoney = 0; for (int i = 0; i < pros.Length; i++) { //表示把這個集合當每一個貨物的價錢累加到總價上 realMoney += pros[i].Price; } return realMoney; } }
當程序運行後,咱們想看見這個超市有什麼東西,多少錢,即展現貨物,而展現貨物的方法已經寫在倉庫類中,按理說應該在Main函數中建立倉庫的對象,這個時候有一個問題,建立對象的時候倉庫裏面只有貨架,而沒有貨物。貨物是在建立超市對象時候纔有的
在超市類最下面調用倉庫類中的展現貨物的函數,這樣就不用再到Main函數中建立倉庫對象
/// <summary> /// 調用倉庫展現貨物的方法,這樣就不用再去Main函數中建立倉庫的對象 /// </summary> public void ShowPros() { ck.ShowPros(); }
寫完這裏,咱們的程序基本完成,在Main函數中建立超市對象並調用
class Program { static void Main(string[] args) { //建立超市對象 SuperMarket sm = new SuperMarket(); //1.展現貨物 sm.ShowPros(); //2.跟用戶進行交互 sm.AskBuying(); Console.ReadKey(); }
最後超市完成購物後,會打印一個小票
public void AskBuying() { Console.WriteLine("歡迎光臨,請問您須要些什麼"); Console.WriteLine("咱們這裏有筆記本電腦(NoteBook)、手機(ShouJi)、醬油(JiangYou)、香蕉(Banana)"); string strType = Console.ReadLine(); Console.WriteLine("您須要多少?"); int count = Convert.ToInt32(Console.ReadLine()); //去倉庫取貨 ProductFather[] pros = ck.QuPros(strType, count); //取貨後,計算價錢,寫一個方法,計算總價錢 double realMoney = GetMoney(pros); //打折方式 Console.WriteLine("您購買的商品,總價是{0}元", realMoney); Console.WriteLine("請選擇你的打折方式 1--不打折 2--打九折 3--打85折 4--買300送50 5--買500送100"); string input = Console.ReadLine(); //經過簡單工廠設計模式根據用戶的輸入得到一個打折對象 CalFather cal = GetCal(input); double totalMoney = cal.GetTotalMoney(realMoney); Console.WriteLine("打完折後,您應付{0}元", totalMoney); Console.WriteLine("如下是您的購物信息"); foreach (var item in pros) { Console.WriteLine("貨物:" + item.Name + "," + "\t" + "貨物單價" + item.Price + "," + "\t" + "貨物編號:" + item.ID); } Console.WriteLine("打完折後,您應付{0}元", totalMoney); }
至此超市收銀系統練習完成!!