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();
}
}
}
运行控制台程序:
如果我们要通过继承来实现这些功能,比如加糖就写一个加糖的子类,要加奶就写一个加奶的子类,也可以实现这些功能,但如果要实现同时加糖、加奶,我们又要重新写一个带有这两个功能的子类,很明显程序会显得臃肿,假如要实现更多的功能,比如我还要加冰,是不是又要写一个子类。采用装饰者模式的优点就在于此,需要哪个功能就调用哪个功能,扩展很方便。
边学习边整理,加深自己的理解!