題目:做一個商場收銀的小程式,可能會出現的情況包括:正常收費,九折優惠,七折優惠,滿300減50等各種不同隨時會變化的優惠活動。 界面如下: 分析: 首先我們對於收錢寫一個父類CashSuper。這個父類是用來包含其他的各種收費方式的:正常收費、七折優惠、八折優惠、九折優惠、滿300減50、滿400 ...
題目:做一個商場收銀的小程式,可能會出現的情況包括:正常收費,九折優惠,七折優惠,滿300減50等各種不同隨時會變化的優惠活動。
界面如下:
分析:
首先我們對於收錢寫一個父類CashSuper。這個父類是用來包含其他的各種收費方式的:正常收費、七折優惠、八折優惠、九折優惠、滿300減50、滿400減70、滿500減100等情況,其中折扣優惠雖然不同,但是類型相似,滿減優惠同理,故此我們可以將正常收費、折扣優惠與滿減優惠分別劃分為三個不同的類:CashNormal、CashRebate、CashReturn。
而CashSuper這個父類是用於繼承的,所以我們設置為abstract用來被重寫的,其次這個父類所包含的的三個子類都會共同調用到一個參數:那就是實際需要收到的商品的價格,所以我們的參數只需要傳進來共同的參數:acceptMoney即可。
1 abstract class CashSuper 2 { 3 public abstract double acceptCash(double acceptMoney); 4 }
然後就是正常收費:CashNormal
首先他從父類獲得參數是實際需要收到的商品的價格,他本身事正常收費沒有任何的優惠,所以直接返回從父類傳進來的值即可。
1 class CashNormal : CashSuper 2 { 3 public override double acceptCash(double acceptMoney) 4 { 5 return acceptMoney; 6 } 7 }
折扣優惠:CashRebate
他和正常收費類似,繼承於父類CashSuper,會獲得來自於父類的參數,得到實際需要收到的商品的價格,但是他需要實現的是對商品進行打折優惠,所以他需要自己定義一個折扣優惠參數,這樣別人調用他的時候將折扣參數傳進來,他就可以通過對原價進行折扣優惠反饋給用戶了。
1 class CashRebate : CashSuper 2 { 3 //這就是cashrebate的屬性了 4 private double monRebate = 1; 5 6 //調用CashRebate的時候需要從外面將優惠程度傳進來 7 public CashRebate(string moneyRebate) 8 { 9 this.monRebate = double.Parse(moneyRebate); 10 } 11 12 public override double acceptCash(double acceptMoney) 13 { 14 return acceptMoney * monRebate; 15 } 16 }
滿減優惠:CashReturn
這個與折扣優惠類似了,只是他有兩個參數而已:滿減的水平線,和減扣多少。故此給此類定義兩個參數即可。
1 class CashReturn : CashSuper 2 { 3 //這就是cashreturn的屬性了 4 private double CashLevel = 0; 5 private double MoneyReturn = 0; 6 7 //對外調用函數所以必須是public 8 public CashReturn(string level,string MonReturn) 9 { 10 this.CashLevel = double.Parse(level); 11 this.MoneyReturn = double.Parse(MonReturn); 12 } 13 14 public override double acceptCash(double acceptMoney) 15 { 16 double result = acceptMoney; 17 if (acceptMoney >= CashLevel) 18 { 19 result = acceptMoney - Math.Floor(acceptMoney / CashLevel) * MoneyReturn; 20 } 21 return result; 22 } 23 }
現在獲得了幾種優惠情況了,但是我們需要判斷什麼時候需要調用哪種優惠情況,這點我們通過用戶的選擇,用戶將選擇的優惠方式傳輸過來,我們再確定調用哪一種優惠方式,這就是利用簡單工廠模式,將所有的優惠方式封裝好,在進一步調用。
1 class CashFactory 2 { 3 //CashSuper現在就類似double之類,返回值就是CashSuper 4 public static CashSuper createCashAccept(string type) 5 { 6 CashSuper cs = null; 7 8 switch (type) 9 { 10 case "正常收費": 11 cs = new CashNormal(); 12 break; 13 case "滿300減50": 14 cs = new CashReturn("300", "50"); 15 break; 16 case "滿500減100": 17 cs = new CashReturn("500", "100"); 18 break; 19 case "滿400減70": 20 cs = new CashReturn("400", "70"); 21 break; 22 case "滿900減200": 23 cs = new CashReturn("900", "200"); 24 break; 25 case "八折優惠": 26 cs = new CashRebate("0.8"); 27 break; 28 case "九折優惠": 29 cs = new CashRebate("0.9"); 30 break; 31 case "七折優惠": 32 cs = new CashRebate("0.7"); 33 break; 34 } 35 return cs; 36 } 37 }
最後在用戶介面調用上面的函數即可。
1 private void ok_button_Click(object sender, EventArgs e) 2 { 3 /**對外這邊需要瞭解兩個函數 4 * 1.CashFactory.createCashAccept,這個是為了確定每一次的購物時調用的哪一種優惠方式 5 * 2.csuper.acceptCash,這個是為了獲得每種優惠方式獲得的優惠結果 6 */ 7 CashSuper csuper = CashFactory.createCashAccept(typecomboBox.SelectedItem.ToString()); 8 9 totalPrices = csuper.acceptCash(double.Parse(unitPrice_textBox.Text) * double.Parse(amount_textBox.Text)); 10 total += totalPrices; 11 listBox1.Items.Add("單價:" + unitPrice_textBox.Text.ToString() + " 數量:" + amount.ToString() + " " + typecomboBox.SelectedItem.ToString() + " 合計:" + totalPrices.ToString()); 12 resultLabel.Text = total.ToString(); 13 }