c# 装饰者模式简单例子

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

namespace 装饰者模式
{
    //建立咖啡的抽象类
    public abstract class Coffee
    {

        public int TotalPrice=30;
        public abstract void print();
    }
    //具体到某种咖啡,这里我们用拿铁举例
    public  class CafeLatte:Coffee
    {
        public CafeLatte()
        {
            print();
        }
        public override void print()
        {
            Console.WriteLine("我是拿铁咖啡,不加料时我的价格是" + TotalPrice + "元。");
        }
    }
    //给咖啡加料
    public abstract class jialiao : Coffee
    {
        public Coffee coffee;
        public jialiao(Coffee co)
        {
            this.coffee = co;
        }
    }

    public class jiatang:jialiao
    {
        public jiatang(Coffee cof):base(cof)
        {
            //加糖的话加两元
            coffee.TotalPrice += 2;
            print();
        }
        public override void print()
        {
            Console.WriteLine("给咖啡加糖了");
            
            Console.WriteLine("现在的价格是:" + coffee.TotalPrice.ToString() + "元");
        }
    }

    public class jianai : jialiao
    {
        public jianai(Coffee co): base(co)
        {
            //加奶的话加5元
            coffee.TotalPrice += 5;
            print();
        }
        public override void print()
        {
            Console.WriteLine("给咖啡加奶了");
            
            Console.WriteLine("现在的价格是:" + coffee.TotalPrice + "元");
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            //实例化一杯拿铁咖啡
            Coffee coffee = new CafeLatte();
            //给这杯咖啡加糖
            jiatang jt = new jiatang(coffee);
            //给这杯咖啡加奶
            jianai jn = new jianai(coffee);
            Console.ReadKey();
        }
    }
}
运行控制台程序:

    如果我们要通过继承来实现这些功能,比如加糖就写一个加糖的子类,要加奶就写一个加奶的子类,也可以实现这些功能,但如果要实现同时加糖、加奶,我们又要重新写一个带有这两个功能的子类,很明显程序会显得臃肿,假如要实现更多的功能,比如我还要加冰,是不是又要写一个子类。采用装饰者模式的优点就在于此,需要哪个功能就调用哪个功能,扩展很方便。

    边学习边整理,加深自己的理解!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值