装饰器模式分析

逐步分析Main方法中的代码执行过程,以及在执行过程中各个方法的调用顺序和输出。

cs 复制代码
using System;

namespace 装饰模式的实现
{
    /// <summary>
    /// 房子抽象接口
    /// </summary>
    public abstract class House
    {
        public abstract void Renovate(); 
    }

    /// <summary>
    /// 装饰抽象类
    /// </summary>
    public abstract class DecorationStrategy : House
    {
        protected House _house;

        protected DecorationStrategy(House house)
        {
            _house = house ?? throw new ArgumentNullException(nameof(house)); // 参数检查
        }

        public override void Renovate() 
        {
            _house?.Renovate();
        }
    }

    /// <summary>
    /// 具体房子
    /// </summary>
    public sealed class StarDengHouse : House
    {
        public override void Renovate()
        {
            Console.WriteLine("装修StarDeng的房子");
        }
    }

    /// <summary>
    /// 安全装饰器
    /// </summary>
    public sealed class HouseSecurityDecorator : DecorationStrategy
    {
        public HouseSecurityDecorator(House house) : base(house) { }

        public override void Renovate()
        {
            base.Renovate();
            Console.WriteLine("增加安全系统");
        }
    }

    /// <summary>
    /// 保温装饰器
    /// </summary>
    public sealed class KeepWarmDecorator : DecorationStrategy
    {
        public KeepWarmDecorator(House house) : base(house) { }

        public override void Renovate()
        {
            base.Renovate();
            Console.WriteLine("增加保温的功能");
        }
    }

    public class Program
    {
        static void Main()
        {
            House myHouse = new StarDengHouse();
            // 创建装饰器
            House securityHouse = new HouseSecurityDecorator(myHouse);
            House securityAndWarmHouse = new KeepWarmDecorator(securityHouse);
            // 装饰房子
            securityAndWarmHouse.Renovate(); 
            Console.ReadLine();
        }
    }
}

代码执行逻辑分析

  1. 创建具体房子实例

    复制代码
    House myHouse = new StarDengHouse();
    • 这里创建了一个 StarDengHouse 的实例,myHouse 代表一个具体的房子。
  2. 创建安全装饰器实例

    复制代码
    House securityHouse = new HouseSecurityDecorator(myHouse);
    • 这行代码创建了一个 HouseSecurityDecorator 实例,传入了 myHouse
    • HouseSecurityDecorator 的构造函数中,会调用基类 DecorationStrategy 的构造函数,初始化 _house 字段为 myHouse
  3. 创建保温装饰器实例

    复制代码
    House securityAndWarmHouse = new KeepWarmDecorator(securityHouse);
    • 这行代码创建了一个 KeepWarmDecorator 实例,传入了 securityHouse
    • KeepWarmDecorator 的构造函数中,会调用基类 DecorationStrategy 的构造函数,初始化 _house 字段为 securityHouse
  4. 装饰房子

    复制代码
    securityAndWarmHouse.Decorate();
    • 这里调用 securityAndWarmHouse.Decorate(),我们将跟踪这个方法的调用过程。

调用过程详细分析

  • 调用 KeepWarmDecorator.Decorate()

    • 该方法首先调用 base.Decorate(),即 DecorationStrategy.Decorate()
  • 调用 DecorationStrategy.Decorate()

    • 在此方法中,调用 _house.Decorate(),这里 _housesecurityHouse,即 HouseSecurityDecorator
  • 调用 HouseSecurityDecorator.Decorate()

    • HouseSecurityDecoratorDecorate() 方法中,首先调用 base.Decorate(),即 DecorationStrategy.Decorate()
  • 再次调用 DecorationStrategy.Decorate()

    • 在这个方法中,再次调用 _house.Decorate(),这次 _housemyHouse,即 StarDengHouse
  • 调用 StarDengHouse.Decorate()

    • 这个方法输出 "装修StarDeng的房子"

输出顺序

随着调用的返回,输出的顺序将是:

  1. StarDengHouse.Decorate() 输出:

    复制代码
    装修StarDeng的房子
  2. HouseSecurityDecorator.Decorate() 输出:

    复制代码
    增加安全系统
  3. KeepWarmDecorator.Decorate() 输出:

    复制代码
    增加保温的功能

最终输出结果

因此,整个程序执行后,控制台的输出将是:

复制代码
装修StarDeng的房子
增加安全系统
增加保温的功能

总结

通过上述分析,我们清楚地看到,装饰器模式通过递归调用的方式,依次执行各个装饰器的逻辑,最终实现了对原始功能的增强。每个装饰器都在原有功能的基础上添加了自己的特性,使得整个系统具备了灵活性和可扩展性。

相关推荐
phdsky3 小时前
【设计模式】策略模式
设计模式·策略模式
烛阴4 小时前
【TS 设计模式完全指南】构建你的专属“通知中心”:深入观察者模式
javascript·设计模式·typescript
Mr_WangAndy6 小时前
C++设计模式_创建型模式_原型模式Prototype
c++·设计模式·原型模式
哆啦code梦7 小时前
设计模式之代理模式-骆驼与巴巴羊的故事
设计模式·代理模式
贝塔实验室7 小时前
ADMM 算法的基本概念
算法·数学建模·设计模式·矩阵·动态规划·软件构建·傅立叶分析
Chan168 小时前
【 设计模式 | 结构型模式 代理模式 】
java·spring boot·后端·设计模式·intellij-idea
大飞pkz12 小时前
【设计模式】适配器模式
开发语言·设计模式·c#·适配器模式
Meteors.12 小时前
23种设计模式——组合模式(Composite Pattern)
设计模式·组合模式
大飞pkz12 小时前
【设计模式】外观模式
开发语言·设计模式·c#·外观模式
青草地溪水旁12 小时前
设计模式(C++)详解——解释器模式(2)
c++·设计模式·解释器模式