提示:以下是本篇文章正文内容,下面案例可供参考
一、基本概念
1)装饰模式:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。
2)装饰模式:有效的把类的核心职责和装饰功能分来解耦了。
二、代码示例
现在有两类奶茶,普通奶茶和果茶,有布丁和珍珠两类材料可以加入。需要一杯加了布丁和珍珠的奶茶
/// <summary>
/// 饮料
/// </summary>
public abstract class YinLiao
{
public abstract double Cost();
}
/// <summary>
/// 奶茶
/// </summary>
public class MilkTea : YinLiao
{
private double cost = 10;
public override double Cost()
{
Console.WriteLine("奶茶10元");
return cost;
}
}
/// <summary>
/// 水果茶
/// </summary>
public class FruitTea : YinLiao
{
private double cost = 15;
public override double Cost()
{
Console.WriteLine("水果茶15元");
return cost;
}
}
/// <summary>
/// 各种调料的父类
/// </summary>
public abstract class Decorator:YinLiao
{
private YinLiao yinLiao;
public YinLiao AddTo(YinLiao yinLiao)
{
this.yinLiao = yinLiao;
return this;//返回当前混合的饮料
}
public override double Cost()
{
return this.yinLiao.Cost();
}
}
/// <summary>
/// 布丁
/// </summary>
public class Buding : Decorator
{
private static double money = 3;
public override double Cost()
{
Console.WriteLine("一份布丁3元");
return base.Cost()+ money;
}
}
/// <summary>
/// 珍珠
/// </summary>
public class ZhenZhu : Decorator
{
private static double money = 4;
public override double Cost()
{
Console.WriteLine("一份珍珠4元");
return base.Cost() + money;
}
}
使用时
//来一杯奶茶,加布丁和珍珠
MilkTea milkTea = new MilkTea();
Buding buding = new Buding();
ZhenZhu zhenZhu = new ZhenZhu();
//开始加入
YinLiao yinLiao1 = buding.AddTo(milkTea);
YinLiao yinLiao2 = zhenZhu.AddTo(yinLiao1);
double v = yinLiao2.Cost();
Console.WriteLine("总共价格:"+v+"元");
三、总结
1)不改变父类的情况,将核心功能和装饰功能分离,易于分类扩展