装饰器模式分析

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

总结

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

相关推荐
YXLY252812 小时前
庭院大门选型方案:铝艺大门的五大设计模式与六大性能优势分析
设计模式
磊 子16 小时前
C++设计模式
javascript·c++·设计模式
许彰午20 小时前
34_Java设计模式之单例模式
java·单例模式·设计模式
小雨青年20 小时前
GitHub Actions 可复用工作流设计模式:把 CI/CD 重复逻辑收起来
ci/cd·设计模式·github
石一峰6992 天前
C 语言函数设计模式实战经验
c语言·开发语言·设计模式
qq_297574672 天前
设计模式系列文章(基础篇第22篇):访问者模式——分离数据结构与操作,实现灵活扩展
数据结构·设计模式·访问者模式
刀法如飞2 天前
领域驱动 vs 本体驱动:DDD 代码建模与 Ontology 语义建模的对比分析
设计模式·架构设计·领域驱动
我爱cope2 天前
【Agent智能体26 | 多智能体-多智能体工作流】
人工智能·设计模式·语言模型·职场和发展
咖啡八杯3 天前
【无标题】
java·后端·设计模式