简单工厂模式-商场收银系统

需求:

做一个商场收银系统:营业员根据客户所购买商品的单价和数量,并且根据商场当前的打折优化活动向客户收费。

类图:

实现:

业务逻辑:

 /// <summary>
    /// 现金收费的抽象类,父类。
    /// </summary>
    abstract class CashSuper
    {
        /// <summary>
        /// 现金收费的抽象方法
        /// </summary>
        /// <param name="money">原价</param>
        /// <returns>当前价格</returns>
        public abstract double acceptCash(double money);
    }//end CashSuper
    
 /// <summary>
     /// 正常收费子类
     /// </summary>
    class CashNormal : CashSuper
    {
        /// <summary>
        /// 重写父类的收费方法
        /// </summary>
        /// <param name="money">原价</param>
        /// <returns>当前价格</returns>
        public override double acceptCash(double money)
        {
            return money;//原价返回
        }//end acceptCash
    }//end CashNormal
    /// <summary>
    /// 打折收费子类
    /// </summary>
    class CashRedbate : CashSuper
    {
        private double moneyRebate = 1d;//具体打几折
        /// <summary>
        /// 获取具体打几折
        /// </summary>
        /// <param name="moneyRebate">具体打几折</param>
        public CashRedbate(string moneyRebate)
        {
            this.moneyRebate = double.Parse(moneyRebate);
        }//end CashRedbate
        /// <summary>
        ///打折的方法
        /// </summary>
        /// <param name="money">原价</param>
        /// <returns>打折之后的价格</returns>
        public override double acceptCash(double money)
        {
            //原价*具体打折数=打折之后的价格
            return money * moneyRebate;
        }//end aceptCash
    }//end CashRedbate
    /// <summary>
    /// 返利收费子类
    /// </summary>
    class CashReturn : CashSuper
    {
        private double moneyCondition = 0.0d;//返利条件
        private double moneyReturn = 0.0d;//反多少
        /// <summary>
        /// 返利条件初始化
        /// </summary>
        /// <param name="moneyCondition">返利条件</param>
        /// <param name="moneyReturn">反多少</param>
        public CashReturn(string moneyCondition,string moneyReturn)
        {
            this.moneyCondition = double.Parse(moneyCondition);//返利条件
            this.moneyReturn = double.Parse(moneyReturn);//反多少
        }//end CashRetur
        /// <summary>
        /// 返利计算方法
        /// </summary>
        /// <param name="money">原价</param>
        /// <returns>返利之后的价格</returns>
        public override double acceptCash(double money)
        {
            double result = money;//要返回的价格
            //判断是否满足返利的要求
            if (money>=moneyCondition)
            {
                result = money - Math.Floor(money/moneyCondition)*moneyReturn;

            }//end if
            return result;//返回价格
        }//end AcceptCash
    }//end CashReturn

 

 /// <summary>
    /// 现金收费工厂类
    /// </summary>
    class CashFactory
    {
        /// <summary>
        /// 根据需要实例化对象
        /// </summary>
        /// <param name="type">需要实例化的对象名</param>
        /// <returns>返回实例化之后的对象</returns>
        public static CashSuper createCashAccept(string type )
        {
            CashSuper cs = null;//实例化父类
            //判断选择了哪种优惠方案
            switch (type)
            {
                case "正常收费":
                    cs = new CashNormal();
                    break;
                case "满300返100":
                    cs = new CashReturn("300","100");
                    break;
                case "打8折":
                    cs = new CashRedbate("0.8");
                    break;
            }//end switch
            return cs;//把具体实例化的类返给方法
        }//end createCashAccept
    }//end CashFactory

客户端:

 //总价
        double total = 0.0d;
private void butok_Click(object sender, EventArgs e)
        {
            //调用现金收费工厂,根据选择实例化对象。
            CashSuper cauper = CashFactory.createCashAccept(combType.SelectedItem.ToString());
            //计算价格
            double totalPrices = 0d;
            totalPrices = cauper.acceptCash(Convert.ToDouble(txtNumber1.Text)
                *Convert.ToDouble(txtNumber2.Text));//计算方法
            total = total + totalPrices;//累加
            listBox1.Items.Add("单价:"+txtNumber1.Text+"数量:"+txtNumber2.Text+"\t" +
                combType.SelectedItem + "合计:"+totalPrices.ToString());
            lblmony.Text = total.ToString();
           
        }

结果:

posted @ 2019-11-06 15:29  康世行  阅读(50)  评论(0编辑  收藏  举报