设计模式系列之-装饰模式

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


//装饰模式Demo
namespace DisCountApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            //优惠方案一
            Order order1 = new Order();
            order1.GoodsTotal = 350;

            OrderDiscount orderDiscount = new OrderDiscount();
            ApplyFullReductionDiscount d1 = new ApplyFullReductionDiscount(100, 10);
            ApplyDiscount d2 = new ApplyDiscount(0.95,200m);
            ApplyDiscount d3 = new ApplyDiscount(0.8);

            Console.WriteLine("\n优惠方案一");
            d1.SetDiscountObject(orderDiscount);
            d2.SetDiscountObject(d1);
            d3.SetDiscountObject(d2);
            d3.Execute(order1);


            //优惠方案二
            Order order2 = new Order();
            order2.GoodsTotal = 150;

            OrderDiscount orderDiscount2 = new OrderDiscount();
            ApplyFullReductionDiscount k1 = new ApplyFullReductionDiscount(100, 9.9m);
            ApplyDiscount k2 = new ApplyDiscount(0.98, 199m);
            ApplyDiscount k3 = new ApplyDiscount(0.88);

            Console.WriteLine("\n优惠方案二");
            k1.SetDiscountObject(orderDiscount2);
            k3.SetDiscountObject(k1);
            k2.SetDiscountObject(k3);
            k2.Execute(order2);
            Console.ReadKey();
        }
    }


    public class Order
    {
        /// <summary>
        /// 商品总价值
        /// </summary>
        public decimal GoodsTotal{get;set;}

        /// <summary>
        /// 扣除折扣,最终客户要付款金额
        /// </summary>
        public decimal GrandTotal{get;set;}
    }

    public interface IOrderDiscount
    {
        void Execute(Order order);
    }

    public class OrderDiscount : IOrderDiscount
    {
        public void Execute(Order order)
        {
            Console.WriteLine("原价为{0}", order.GoodsTotal.ToRoundString());
        }
    }

    public abstract class DiscountBase : IOrderDiscount
    {
        private IOrderDiscount discount = null;

        public  void SetDiscountObject(IOrderDiscount discount)
        {
            this.discount = discount;
        }

        public virtual void Execute(Order order)
        {
            if (discount != null)
            {
               discount.Execute(order);
            }
        }
    }

  
    //满减优惠
    public class ApplyFullReductionDiscount : DiscountBase
    {
        private decimal fullMoney = decimal.Zero;
        private decimal reductionMoney = decimal.Zero;

        public ApplyFullReductionDiscount(decimal fullMoney,decimal reductionMoney)
        {
            this.fullMoney = fullMoney;
            this.reductionMoney = reductionMoney;
        }

        public override void Execute(Order order)
        {
            base.Execute(order);
            if (order.GoodsTotal >= fullMoney)
            {
                order.GoodsTotal = order.GoodsTotal - reductionMoney;
                Console.WriteLine("满{0}减{1}后的金额为{2}", this.fullMoney, this.reductionMoney, order.GoodsTotal.ToRoundString());
                return;
            }
            Console.WriteLine("条件不满足,无法使用满{0}减{1}的优惠", this.fullMoney, this.reductionMoney);
        }
    }

    //打折优惠
    public class ApplyDiscount : DiscountBase
    {
        private double discountRate = 1d;
        private decimal? moneyCondition = null;
        private Order order = null;

        public ApplyDiscount(double discountRate, decimal? moneyCondition)
        {
            this.discountRate = discountRate;
            this.moneyCondition = moneyCondition;
        }

        public ApplyDiscount(double discountRate)
            : this(discountRate,null)
        {

        }

        public override void Execute(Order order)
        {
            this.order = order;
            base.Execute(this.order);
            if (this.moneyCondition != null)
            {
                if (this.order.GoodsTotal >= this.moneyCondition.Value)
                {
                    this.ExecuteDiscount();
                }
                else
                {
                    Console.WriteLine("条件不满足,金额未满{0},无法满足打{1}折的优惠",this.moneyCondition.Value.ToRoundString(), this.discountRate);
                    return;
                }
            }
            else
            {
                this.ExecuteDiscount();
            }
            Console.WriteLine("打{0}折后的金额为{1}", this.discountRate, order.GoodsTotal.ToRoundString());
        }

        private void ExecuteDiscount()
        {
            this.order.GoodsTotal = this.order.GoodsTotal * (decimal)this.discountRate;
        }
    }


    //扩展Decimal类型
    public static class DecimalExtend
    { 
        public static string ToRoundString(this decimal d)
        {
            return Math.Round(d, 2, MidpointRounding.ToEven).ToString("f2");
        }
    }
}

 

posted @ 2015-01-27 16:02  玻璃鱼儿  阅读(274)  评论(0编辑  收藏  举报