装饰器模式分析

逐步分析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的房子
增加安全系统
增加保温的功能

总结

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

相关推荐
范纹杉想快点毕业6 小时前
实战级ZYNQ中断状态机FIFO设计
java·开发语言·驱动开发·设计模式·架构·mfc
茂桑10 小时前
DDD领域驱动设计-基础设施层
设计模式·架构
小温冲冲14 小时前
通俗且全面精讲工厂设计模式
设计模式
进击的小头14 小时前
设计模式与C语言高级特性的结合
c语言·设计模式
小温冲冲14 小时前
通俗且全面精讲单例设计模式
开发语言·javascript·设计模式
Vivienne_ChenW14 小时前
DDD领域模型在项目中的实战
java·开发语言·后端·设计模式
sg_knight15 小时前
原型模式(Prototype)
python·设计模式·开发·原型模式
短剑重铸之日15 小时前
《设计模式》第九篇:三大类型之结构型模式
java·后端·设计模式·组合模式·代理模式·结构性模式
忧郁的Mr.Li16 小时前
设计模式--单例模式
javascript·单例模式·设计模式
范纹杉想快点毕业16 小时前
状态机设计模式与嵌入式系统开发完整指南
java·开发语言·网络·数据库·mongodb·设计模式·架构