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);
            }
        }
  • 相关阅读:
    Linux下Java安装与配置
    HYSPLIT模式简介及在线平台使用
    HYSPLIT模式简介及单机版使用图文教程
    有关气象类资料数据下载网址
    Excel图表编程应用大全(2):图表编程基础
    当装系统时遇到“选中的磁盘采用GPT分区形式”
    SQL函数
    Centos6.7 Redis3.2.8的主从搭建
    Centos 6.7 中 Redis-3.2.8的安装
    Mysql innodb_buffer_pool_size的研究
  • 原文地址:https://www.cnblogs.com/zhou-yi/p/5383728.html
Copyright © 2011-2022 走看看