当前位置: 首页 > 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.xdnf.cn/news/1161577.html

相关文章:

  • Android Studio 的 Gradle 究竟是什么?
  • 在 Conda 中删除环境及所有安装的库
  • ElasticSearch:不停机更新索引类型(未验证)
  • 【iOS】锁[特殊字符]
  • 归并排序:优雅的分治排序算法(C语言实现)
  • Spring Boot05-热部署
  • 设计模式六:工厂模式(Factory Pattern)
  • Trae开发uni-app+Vue3+TS项目飘红踩坑
  • 数据结构自学Day11-- 排序算法
  • 迁移科技3D视觉系统:赋能机器人上下料,开启智能制造高效新纪元
  • react-window 大数据列表和表格数据渲染组件之虚拟滚动
  • GoLang教程005:switch分支
  • Git核心功能简要学习
  • 面试总结第54天微服务开始
  • Neo4j graph database
  • 【数据结构与算法】数据结构初阶:详解二叉树(二)——堆
  • Vue3 面试题及详细答案120道 (1-15 )
  • Node.js的Transform 流
  • 2x2矩阵教程
  • 亚马逊自养号测评实战指南:从环境搭建到安全提排名
  • G1垃圾回收器
  • 复习博客:JVM
  • LVS 集群技术基础
  • Valgrind Cachegrind 全解析:用缓存效率,换系统流畅!
  • 【初识数据结构】CS61B中的最小生成树问题
  • 本地部署Nacos开源服务平台,并简单操作实现外部访问,Windows 版本
  • ZooKeeper学习专栏(四):单机模式部署与基础操作详解
  • ruoyi-flowable-plus Excel 导入数据 Demo
  • 【qml-3】qml与c++交互第二次尝试(类型方式)
  • (9)机器学习小白入门 YOLOv:YOLOv8-cls 技术解析与代码实现