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

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

装饰器模式(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();
    }
}

你可能感兴趣的:(.NET高级面试指南,C#,.net,面试,装饰器模式)