.NET高级面试指南专题十六【 装饰器模式介绍,包装对象来包裹原始对象】

在这里插入图片描述

装饰器模式(Decorator
Pattern)是一种结构型设计模式,用于动态地给对象添加额外的职责,而不改变其原始类的结构。它允许向对象添加行为,而无需生成子类。

实现原理:

装饰器模式通过创建一个包装对象来包裹原始对象,并在包装对象上添加额外的功能。这种模式允许将一个或多个装饰器叠加在原始对象上,从而实现功能的组合。

思路:

  • 定义一个抽象组件接口,该接口声明了原始对象和装饰器的公共方法。
  • 创建具体组件类,实现抽象组件接口,表示原始对象。
  • 创建抽象装饰器类,实现抽象组件接口,包含一个对抽象组件的引用,并在其基础上添加额外的功能。
  • 创建具体装饰器类,继承自抽象装饰器类,实现具体的装饰功能。
  • 在客户端代码中,通过组合装饰器对象来动态地添加功能。

优点:

  1. 对扩展开放、对修改封闭:通过装饰器模式,可以在不修改原始类的情况下动态地添加新功能,使得代码更加灵活、可扩展。
  2. 遵循单一职责原则:每个装饰器只关注于单一功能的添加,使得代码更易于理解和维护。

C#代码示例:

using System;

// 抽象组件接口
interface IComponent
{
    void Operation();
}

// 具体组件类
class ConcreteComponent : IComponent
{
    public void Operation()
    {
        Console.WriteLine("ConcreteComponent Operation");
    }
}

// 抽象装饰器类
abstract class Decorator : IComponent
{
    protected IComponent _component;

    public Decorator(IComponent component)
    {
        this._component = component;
    }

    public virtual void Operation()
    {
        if (_component != null)
        {
            _component.Operation();
        }
    }
}

// 具体装饰器类
class ConcreteDecoratorA : Decorator
{
    public ConcreteDecoratorA(IComponent component) : base(component)
    {
    }

    public override void Operation()
    {
        base.Operation();
        Console.WriteLine("ConcreteDecoratorA Operation");
    }
}

class ConcreteDecoratorB : Decorator
{
    public ConcreteDecoratorB(IComponent component) : base(component)
    {
    }

    public override void Operation()
    {
        base.Operation();
        Console.WriteLine("ConcreteDecoratorB Operation");
    }
}

class Program
{
    static void Main(string[] args)
    {
        // 创建具体组件对象
        IComponent component = new ConcreteComponent();

        // 使用装饰器A装饰具体组件
        Decorator decoratorA = new ConcreteDecoratorA(component);
        decoratorA.Operation();

        Console.WriteLine("-----------");

        // 使用装饰器B装饰具体组件
        Decorator decoratorB = new ConcreteDecoratorB(component);
        decoratorB.Operation();

        Console.WriteLine("-----------");

        // 使用装饰器A和B叠加装饰具体组件
        Decorator decoratorAB = new ConcreteDecoratorB(new ConcreteDecoratorA(component));
        decoratorAB.Operation();
    }
}
  • 13
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

搬砖的诗人Z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值