当前位置: 首页 > news >正文

装饰器模式分析

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

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

总结

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

http://www.lryc.cn/news/594867.html

相关文章:

  • java解析nc气象数据
  • numpy库的基础知识
  • 用Dify构建气象智能体:从0到1搭建AI工作流实战指南
  • React-useEffect的闭包陷阱(stale closure)
  • react 录音功能
  • 《Linux 环境下 Nginx 多站点综合实践:域名解析、访问控制与 HTTPS 加密部署》​
  • 大模型——Prompt 优化还是模型微调
  • Ubuntu 22.04 安装 Docker (安装包形式)
  • WPF 项目设置应用程序图标和设置程序集图标
  • 移星科技 modbus-tcp 转 modbus-Rtu模块
  • (数据结构)线性表(中):SLIst单链表
  • tcpdump 命令解析(随手记)
  • IOPaint+CPolar:零公网IP也能搭建专属AI图像编辑平台
  • 高级技术【Java】【反射】【注解】【动态代理】
  • 复习博客:JVM
  • 【Project】ELK 7.17.16 日志分析系统部署
  • 阿里云平台使用的ack创建的pod与服务器中的MongoDB不在同一网段如何解决
  • 【图像处理基石】什么是相机的内外参数?
  • 单表查询-分页提前获取数据
  • 自动化与安全 - 将 Terraform 集成到 CI/CD
  • 安装pytorch(cpu版)
  • 电科金仓2025发布会,国产数据库的AI融合进化与智领未来
  • 【Lucene】SimScorer
  • 【Spring AI】Advisors API—顾问(即拦截器)
  • 轨迹优化 | 基于边界中间值问题(BIVP)的路径平滑求解器(附C++/Python仿真)
  • 6.String、StringBuffer、StringBuilder区别及使用场景
  • C++学习笔记(六:数组)
  • AI Agent与MCP Service技术进展结构化分析报告(2025Q2)
  • 解决win10下Vmware虚拟机在笔记本睡眠唤醒后ssh连接不上的问题
  • 项目研发进度安排