装饰器设计模式

装饰器模式模式一直以来都以烧脑著称,今天大话一下红烧肉的做法进行装饰模式的展示。

一、类之间的关系

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();

八、放张图

九、总结

装饰器模式原理就是将类之间的纵向关系和横向关系相结合,之所装饰的根本在于他们都有一个抽象类的约束,有一个基装饰器,里面有字段用来保存装饰的示例,其他字装饰器都继承基装饰器,子装饰器之间都是平行存在,基装饰器运用类关系的纵向和横向。

猜你喜欢

转载自blog.csdn.net/weixin_40184249/article/details/81264249