前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >重温设计模式 --- 装饰器模式

重温设计模式 --- 装饰器模式

作者头像
Niuery Diary
发布2023-10-22 16:38:10
1260
发布2023-10-22 16:38:10
举报

引言

装饰器模式是一种结构型设计模式,它允许在不改变原始对象的情况下,通过将其包装在一个装饰器对象中,来动态地添加额外的功能。

装饰器模式的核心思想是,将一个对象放在另一个对象的外面,以给原始对象添加新的行为。这个“另一个对象”就是装饰器(Decorator),它持有一个原始对象(Component)的引用,并实现与原始对象相同的接口。装饰器可以通过调用原始对象的方法,来执行自己的行为。这种方式可以动态地添加、删除或替换对象的行为,而不需要修改原始对象的代码。

基本类接口

定义一个基本对象接口或抽象类,称为Component,它定义了一些基本操作:

代码语言:javascript
复制
//定义基本对象接口
public  interface  IComponent
{
    void Operation();
}

基本类实现

定义一个实现IComponent接口的具体类:

代码语言:javascript
复制
//IComponent接口的实现类
public  class  ConcreteComponent : IComponent
{
    public void Operation()
    {
        Console.WriteLine("ConcreteComponent.Operation()");
    }
}

装饰器抽象

定义一个装饰器抽象类或接口,称为Decorator,它也实现了Component接口,并在其中添加了一些新的操作:

代码语言:javascript
复制
//装饰器抽象
public  abstract  class  Decorator : IComponent
{
    private IComponent component;

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

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

装饰器实现

代码语言:javascript
复制
//实现多个装饰器类
public  class  ConcreteDecoratorA : Decorator
{
    public ConcreteDecoratorA(IComponent component) : base(component)
    {
    
    }

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

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

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

接着,我们可以创建并使用一个具有特定功能对象:

代码语言:javascript
复制
IComponent component = new ConcreteComponent();

IComponent decoratorA = new ConcreteDecoratorA(component);

IComponent decoratorB = new ConcreteDecoratorB(decoratorA);

decoratorB.Operation();

输出如下:

代码语言:javascript
复制
ConcreteComponent.Operation()

ConcreteDecoratorA.Operation()

ConcreteDecoratorB.Operation()

上文例子中,我们创建了一个基本对象ConcreteComponent,并创建了两个装饰器ConcreteDecoratorAConcreteDecoratorB,最后,我们使用这些装饰器来创建一个具有特定功能的对象,并调用它的操作方法。输出结果显示,这个对象实际上执行了多个操作,包括基本操作和添加的操作。

装饰器模式本身有两个缺点。首先,它可能会导致对象数量的增加,因为每个装饰器都需要一个单独的对象。其次,由于装饰器可以相互嵌套,在创建复杂的装饰器结构时可能会变得难以理解和维护。

结论

装饰器模式的优点是它可以动态地添加对象的新行为,而无需改变其原始类。这样,我们可以通过组合不同的装饰器来创建多种对象变体,同时保持原始对象的完整性和一致性。且装饰器模式遵循开放/封闭原则,因为它允许我们添加新的功能,而无需修改现有代码。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-04-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Niuery Diary 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 引言
    • 基本类接口
      • 基本类实现
        • 装饰器抽象
          • 装饰器实现
          • 结论
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档