C# 装饰器模式

栏目总目录


概念

装饰器模式是一种结构型设计模式,它允许在不改变现有对象结构的基础上,通过创建一个包装器(装饰器)来动态地给对象添加一些额外的职责(功能)。就增加功能来说,装饰器模式相比生成子类更为灵活。这种模式创建了一个包装对象,即装饰器,来包裹真实对象。

角色

在装饰器模式中,主要存在以下几个角色:

  1. 抽象构件(Component)角色:定义一个对象接口,可以给这些对象动态地添加一些职责。
  2. 具体构件(ConcreteComponent)角色:定义了一个具体的对象,也可以给这个对象添加一些职责。
  3. 抽象装饰类(Decorator)角色:持有一个构件(Component)对象的引用,并定义一个与抽象构件接口一致的接口。
  4. 具体装饰类(ConcreteDecorator)角色:负责给构件对象"贴上"一些附加的职责。

好处

  1. 动态扩展功能:允许在运行时动态地给对象添加额外的功能,而无需修改原始对象的代码。
  2. 遵循开闭原则:对扩展开放,对修改关闭。
  3. 单一职责原则:每个装饰器只关注于特定的功能,使得代码更加清晰、可维护性更好。
  4. 避免类爆炸:避免了因静态继承导致的类数量过多的问题。
  5. 高度灵活性:可以根据需要任意组合和嵌套装饰器,实现不同的功能组合。

应用场景

  1. 扩展一个类的功能:当需要给一个类添加额外功能,但又不想修改其原有代码时。
  2. 动态增加或撤销功能:需要动态地给对象添加或移除功能时。
  3. 多个功能组合:需要实现多个功能的不同组合时。

示例代码

模拟了给手机添加不同配件(如贴膜、保护壳等)的场景。

csharp 复制代码
using System;

// 抽象构件(Component)角色
public interface IPhone
{
    void Display();
}

// 具体构件(ConcreteComponent)角色
public class BasicPhone : IPhone
{
    public void Display()
    {
        Console.WriteLine("显示基本手机信息");
    }
}

// 抽象装饰类(Decorator)角色
public abstract class PhoneDecorator : IPhone
{
    protected IPhone Phone { get; }

    public PhoneDecorator(IPhone phone)
    {
        Phone = phone;
    }

    public abstract void Display();
}

// 具体装饰类(ConcreteDecorator)角色
// 贴膜装饰器
public class StickerDecorator : PhoneDecorator
{
    public StickerDecorator(IPhone phone) : base(phone)
    {
    }

    public override void Display()
    {
        Phone.Display();
        Console.WriteLine("给手机贴上贴膜");
    }
}

// 保护壳装饰器
public class ProtectiveCaseDecorator : PhoneDecorator
{
    public ProtectiveCaseDecorator(IPhone phone) : base(phone)
    {
    }

    public override void Display()
    {
        Phone.Display();
        Console.WriteLine("给手机安装保护壳");
    }
}

// 客户端代码
class Program
{
    static void Main(string[] args)
    {
        // 创建一个基本手机对象
        IPhone phone = new BasicPhone();

        // 使用贴膜装饰器装饰手机
        phone = new StickerDecorator(phone);

        // 使用保护壳装饰器进一步装饰手机
        phone = new ProtectiveCaseDecorator(phone);

        // 显示装饰后的手机信息
        phone.Display();

        // 输出结果:
        // 显示基本手机信息
        // 给手机贴上贴膜
        // 给手机安装保护壳

        Console.ReadLine();
    }
}

总结

装饰器模式提供了一种灵活的方式来动态地给对象添加新的功能,而无需修改其原有的代码。通过创建装饰器类,我们可以在不改变原有类结构的情况下,实现功能的扩展和组合,增强了代码的灵活性和可维护性。在C#开发中,装饰器模式尤其适用于需要动态扩展功能的场景。

相关推荐
汝生淮南吾在北14 分钟前
SpringBoot+Vue饭店点餐管理系统
java·vue.js·spring boot·毕业设计·毕设
冬夜戏雪3 小时前
【java学习日记】【2025.12.7】【7/60】
java·开发语言·学习
CC.GG4 小时前
【C++】二叉搜索树
java·c++·redis
JIngJaneIL5 小时前
基于Java非遗传承文化管理系统(源码+数据库+文档)
java·开发语言·数据库·vue.js·spring boot
南部余额5 小时前
踩坑与解惑:深入理解 SpringBoot 自动配置原理与配置排除机制
java·spring boot·自动配置原理·import
木鹅.7 小时前
LangChain4j
java
永远都不秃头的程序员(互关)7 小时前
Java核心技术精要:高效实践指南
java·开发语言·性能优化
未来之窗软件服务7 小时前
幽冥大陆(四十一)美萍V10酒店门锁SDK C#语言仙盟插件——东方仙盟筑基期
开发语言·c#·仙盟创梦ide·东方仙盟·东方仙盟sdk·酒店智能门锁·东方仙盟 vos 智能浏览器
CoderYanger7 小时前
动态规划算法-子序列问题(数组中不连续的一段):28.摆动序列
java·算法·leetcode·动态规划·1024程序员节
代码栈上的思考7 小时前
深入解析Spring IoC核心与关键注解
java·后端·spring