装饰器模式模式一直以来都以烧脑著称,今天大话一下红烧肉的做法进行装饰模式的展示。
一、类之间的关系
1、纵向关系:继承
2、横向关系:聚合、组合
二、先声明一个抽象的菜品基类
public abstract class AbstractFood
{
public string Name { get; set; }
public int Price { get; set; }
public abstract void Cook();
public void Show()
{
Console.WriteLine("菜名:"+this.Name+"价格"+this.Price);
}
}
三、声明一个菜品的子类(肉)
public class Meat: AbstractFood
{
public override void Cook()
{
Console.WriteLine("准备做红烧肉");
Console.WriteLine("二斤生猪肉");
}
}
四、声明一个菜品装饰器基类,继承AbstractFood
public class BaseDecorator : AbstractFood
{
private AbstractFood _Food = null;
public BaseDecorator(AbstractFood food)
{
Console.WriteLine("{0}被构造", this.GetType().Name);
this._Food = food;
}
public override void Cook()
{
this._Food.Cook();
}
}
五、声明一个加盐的基类
class SaltDecorator : BaseDecorator
{
public SaltDecorator(AbstractFood food) : base(food)//调用父类的构造函数
{
Console.WriteLine("{0}被构造", this.GetType().Name);
}
public override void Cook()
{
base.Cook();
Console.WriteLine("加点盐和酱油");
}
}
六、声明一个加糖的子类
public class SugarDecorator : BaseDecorator
{
public SugarDecorator(AbstractFood food) : base(food)
{
Console.WriteLine("{0}被构造", this.GetType().Name);
}
public override void Cook()
{
base.Cook();
Console.WriteLine("加点糖。。。。。");
Console.WriteLine("红烧肉出锅,狗子上菜去");
}
}
七、红烧肉加工
AbstractFood food = new Meat()
{
Name = "红烧肉",
Price=58
};
//加点盐和酱油
food = new SaltDecorator(food);
//加点糖准备出锅
food = new SugarDecorator(food);
food.Cook();
八、放张图
九、总结
装饰器模式原理就是将类之间的纵向关系和横向关系相结合,之所装饰的根本在于他们都有一个抽象类的约束,有一个基装饰器,里面有字段用来保存装饰的示例,其他字装饰器都继承基装饰器,子装饰器之间都是平行存在,基装饰器运用类关系的纵向和横向。