装饰模式

以下是关于装饰模式的Markdown文件,其中包含C#示例代码:

装饰模式(Decorator Pattern)

装饰模式是一种结构型设计模式,它允许向一个现有的对象添加新的功能,同时又不改变其结构。这个模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整的前提下,提供额外的功能。

模式结构#

  1. 组件接口(Component Interface):定义对象的接口,可以给这些对象动态地添加职责。
  2. 具体组件(Concrete Component):实现组件接口的基本对象。
  3. 装饰类(Decorator):实现组件接口,并包含一个组件对象的实例,可以给这些对象添加职责。
  4. 具体装饰类(Concrete Decorators):实现装饰类,负责向组件添加具体的职责。

C# 示例#

组件接口#

// 组件接口 IComponent 定义了对象的基本操作。
public interface IComponent
{
    void Operation();
}

具体组件类#

// 具体组件类 ConcreteComponent 实现了组件接口 IComponent 并提供了操作功能。 
public class ConcreteComponent : IComponent
{
    public void Operation()
    {
        Console.WriteLine("具体组件类中的操作或方法");
    }
}

装饰类#

// 装饰类 Decorator 实现了组件接口 IComponent 并包含一个组件对象的实例。  
public abstract class Decorator : IComponent
{
    protected IComponent _component;

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

    public virtual void Operation()
    {
        _component.Operation();
    }
}

具体装饰类#

// 具体装饰类 ConcreteDecoratorA 和 ConcreteDecoratorB 实现了装饰类 Decorator,并提供了额外的功能。
public class ConcreteDecoratorA : Decorator
{
    public ConcreteDecoratorA(IComponent component) : base(component) { }

    public override void Operation()
    {
        base.Operation();
        AddedBehavior();
    }

    void AddedBehavior()
    {
        Console.WriteLine("ConcreteDecoratorA Added Behavior");
    }
}

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

    public override void Operation()
    {
        base.Operation();
        AddedBehavior();
    }

    void AddedBehavior()
    {
        Console.WriteLine("ConcreteDecoratorB Added Behavior");
    }
}

客户端代码#

class Program
{
    static void Main(string[] args)
    {
        IComponent component = new ConcreteComponent();
        Console.WriteLine("初始化:");
        component.Operation();

        Console.WriteLine("\n初始化ConcreteDecoratorA:");
        IComponent decoratorA = new ConcreteDecoratorA(component);
        decoratorA.Operation();

        Console.WriteLine("\n初始化ConcreteDecoratorB:");
        IComponent decoratorB = new ConcreteDecoratorB(component);
        decoratorB.Operation();

        Console.WriteLine("\n初始化ConcreteDecoratorA and 初始化ConcreteDecoratorB:");
        IComponent decoratorAandB = new ConcreteDecoratorB(decoratorA);
        decoratorAandB.Operation();
    }
}

运行结果#

初始化:
具体组件类中的操作或方法

初始化ConcreteDecoratorA:
具体组件类中的操作或方法
ConcreteDecoratorA Added Behavior

初始化ConcreteDecoratorB:
具体组件类中的操作或方法
ConcreteDecoratorB Added Behavior

初始化ConcreteDecoratorA and 初始化ConcreteDecoratorB:
具体组件类中的操作或方法
ConcreteDecoratorA Added Behavior
ConcreteDecoratorB Added Behavior

优缺点#

优点#

  • 动态地给对象添加新的职责。
  • 扩展对象功能比继承更灵活。
  • 符合单一职责原则,可以将功能划分到不同的装饰类中。

缺点#

  • 产生许多小对象,增加了系统的复杂性。
  • 比继承方式更难调试。

总结#

装饰模式提供了一种灵活且可扩展的方法来动态地给对象添加新功能。在需要频繁扩展或修改类功能时,装饰模式比继承更加适用。

作者:zhuhy

出处:https://www.cnblogs.com/AILove/p/18219488

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   zhuhy  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示