zoukankan      html  css  js  c++  java
  • 设计模式之笔记--装饰模式(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);
            }
        }
  • 相关阅读:
    Kafka:主要参数详解(转)
    CXF:根据werservice代码生成WSDL(转)
    CentOS:ECDSA host key "ip地址" for has changed and you have requested strict checking(转)
    Oracle:一个用户操作多个表空间中表的问题(转)
    CentOS:设置系统级代理(转)
    Apache2.4:AH01630 client denied by server configuration
    Amabri:如何删除或停止指定的服务
    08 操作符相关
    07 Test结构
    06 退出 退出状态
  • 原文地址:https://www.cnblogs.com/zhou-yi/p/5383728.html
Copyright © 2011-2022 走看看