面向對象綜合練習(超市收銀系統)

綜合實戰:超市收銀系統設計模式

分析系統需求
超市提供的商品:筆記本電腦、手機、醬油、香蕉
商品在超市裏面應該有:價格、數量、編號
這樣就能抽象出來一個父類(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);
    }

至此超市收銀系統練習完成!!

相關文章
相關標籤/搜索