装饰器模式分析

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

总结

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

相关推荐
LayZhangStrive3 小时前
设计模式(二)装饰器模式、代理模式(待更新)
设计模式·代理模式·装饰器模式·后端开发
AI人工智能+电脑小能手1 天前
大白话说Java设计模式-28-模板方法模式(业务实战篇)
java·设计模式·模板方法模式·spring源码·订单系统·代码复用
leeyi2 天前
两个 Agent 怎么协作:Host-Worker 模式(第91篇-E77)
设计模式·agent·ai编程
AI人工智能+电脑小能手2 天前
大白话说Java设计模式-26-策略模式(业务实战篇)
java·spring·设计模式·策略模式·支付系统·算法切换
星火10242 天前
【Groovy翻译-进阶篇】Groovy 中的设计模式
后端·设计模式·groovy
AI人工智能+电脑小能手2 天前
大白话说Java设计模式-27-策略模式(源码剖析篇)
java·spring·设计模式·策略模式·源码分析·事务管理·comparator
SL_staff2 天前
风控规则如何从硬编码解耦?我们在 JVS-Rules 中的实践与思考
java·spring boot·设计模式
小此方3 天前
Linux加餐(一):藏在Linux中的设计模式(一)策略模式与日志
linux·设计模式·策略模式
To_OC3 天前
从一行入口代码啃透 NestJS:工厂模式、装饰器和依赖注入是怎么串起来的
后端·设计模式·nestjs
东方小月3 天前
从零开发一个 Coding Agent(十二):实现版本化 JSONL 与真实 CLI 入口
前端·设计模式·前端框架