装饰器模式分析

逐步分析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(),这里 _house 是 securityHouse,即 HouseSecurityDecorator。
  • 调用 HouseSecurityDecorator.Decorate():

    • 在 HouseSecurityDecorator 的 Decorate() 方法中,首先调用 base.Decorate(),即 DecorationStrategy.Decorate()。
  • 再次调用 DecorationStrategy.Decorate():

    • 在这个方法中,再次调用 _house.Decorate(),这次 _house 是 myHouse,即 StarDengHouse。
  • 调用 StarDengHouse.Decorate():

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

输出顺序

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

  1. StarDengHouse.Decorate() 输出:

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

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

    复制代码
    增加保温的功能

最终输出结果

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

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

总结

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

相关推荐
博风3 小时前
19、设计模式应用举例:桥接模式:制作电视节目
设计模式·桥接模式
知守观3 小时前
从 4 套 PDF 库的混战,聊聊老项目的依赖管理与“静默失败”
java·后端·设计模式
geovindu1 天前
rust: Mediator Pattern
开发语言·后端·设计模式·rust·中介者模式·行为模式
SENKS_DIGITAL1 天前
金属加工遇上数字化:通快展厅里的工业蜕变-森克思科技
科技·设计模式·展厅设计·展馆设计·科技展厅设计·展览设计·企业展厅设计
flower9803231 天前
C++消息总线软件开发框架AI重构版
c++·设计模式·架构
zzu123zsw2 天前
业务拆分后的治理深水区:解构企业级微服务六大核心设计模式与高可用落真实践
微服务·设计模式·架构·高可用·微服务架构设计
牧瀬クリスだ2 天前
观察者模式:一个对象变化,一群对象自动响应
java·观察者模式·设计模式
拆房老料2 天前
【第四部分:Agentic 智能体设计模式】16. 一个 Prompt 搞不定复杂任务?试试 Prompt Chaining
java·前端·人工智能·设计模式·prompt
MobotStone3 天前
AI 写代码越来越爽,但程序员可能越来越废了
人工智能·设计模式
墨子夕3 天前
设计模式——Java × Python 双语言精讲 · 23 个经典模式 + 现代演进(前言篇)
java·开发语言·设计模式