• 设计模式之笔记--装饰模式(Decorator)


    装饰模式(Decorator)

    定义

          装饰模式(Decorator),动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。

    类图

    描述

    Component:被装饰者和装饰者共有的基类;

    ConcreteComponent:被装饰者的具体类;

    Decorator:装饰类,包含一个Component实例;

    ConcreteDecorator:具体的装饰类,其构造函数里有一个Component实例,方法可以扩展。

    应用场景

          下面条的时候,可以在面条里放入西红柿、鸡蛋等食材,如果只在面条里放入西红柿,就是西红柿面条;如果只在面条里放入鸡蛋,就是鸡蛋面条;如果在面条里放入西红柿和鸡蛋,就是西红柿鸡蛋面条。面条可以看作被装饰者,西红柿、鸡蛋则可以被看作装饰者。

        /// <summary>
        /// 食物
        /// </summary>
        public abstract class Food
        {
            private string name;
            /// <summary>
            /// 食物的名称
            /// </summary>
            public string Name
            {
                get { return name; }
                set { name = value; }
            }
    
            public abstract void Cook();
        }
    
        /// <summary>
        /// 面条
        /// </summary>
        public class Noodles : Food
        {
            public Noodles()
            {
                this.Name = "面条";
            }
    
            public override void Cook()
            {
                Console.WriteLine(this.Name);
            }
        }
    
        /// <summary>
        /// 食材
        /// </summary>
        public abstract class Ingredients : Food
        {
            protected Food food;
    
            public Ingredients(Food food)
            {
                this.food = food;
            }
        }
    
        /// <summary>
        /// 西红柿
        /// </summary>
        public class Tomato : Ingredients
        {
            public Tomato(Food food)
                : base(food)
            {
                this.Name = "西红柿" + this.food.Name;
            }
    
            public override void Cook()
            {
                Console.WriteLine(this.Name);
            }
        }
    
        /// <summary>
        /// 鸡蛋
        /// </summary>
        public class Egg : Ingredients
        {
            public Egg(Food food)
                : base(food)
            {
                this.Name = "鸡蛋" + this.food.Name;
            }
    
            public override void Cook()
            {
                Console.WriteLine(this.Name);
            }
        }
  • 相关阅读:
    Chrome触发唤起IE, 注册唤起程序
    .net post请求过长 , 超过配置 maxQueryStringLength值
    eclipse 初探踩坑实录
    eslint 报error
    前端3小时配置空白机环境
    sql语句
    maven3.04管理jetty9.2.10启动web项目
    Oracle日期时间
    AngularJS向指令传递数据
    jetty和tomcat启动项目
  • 原文地址:https://www.cnblogs.com/zhou-yi/p/5383728.html
Copyright © 2020-2023  润新知