不得不说的结构型模式-装饰器模式

目录

 装饰器模式是什么

下面是装饰器模式的一个通用的类图:

以下是使用C++实现装饰器模式的示例代码:

下面是面试中关于桥接器模式的常见的问题:

下面是问题的答案:


 装饰器模式是什么

装饰器模式是一种结构型设计模式,它允许在运行时动态地添加或修改对象的功能,而无需改变其原始类。在这个模式中,使用一个装饰器类来包装原始类,并且这个装饰器类和原始类具有相同的接口,这样就可以透明地将新的功能添加到原始对象中,而不需要修改原始对象的代码。

下面是装饰器模式的一个通用的类图:

以下是使用C++实现装饰器模式的示例代码:

#include <iostream>
using namespace std;

// 基础组件类
class Component {
public:
    virtual void operation() = 0;
};

// 具体组件类
class ConcreteComponent : public Component {
public:
    void operation() {
        cout << "ConcreteComponent operation." << endl;
    }
};

// 装饰器基类
class Decorator : public Component {
protected:
    Component* component;  // 指向被装饰对象的指针
public:
    Decorator(Component* comp) {
        component = comp;
    }
    void operation() {
        component->operation();
    }
};

// 具体装饰器类A
class ConcreteDecoratorA : public Decorator {
public:
    ConcreteDecoratorA(Component* comp) : Decorator(comp) {}
    void operation() {
        Decorator::operation();
        cout << "ConcreteDecoratorA operation." << endl;
    }
};

// 具体装饰器类B
class ConcreteDecoratorB : public Decorator {
public:
    ConcreteDecoratorB(Component* comp) : Decorator(comp) {}
    void operation() {
        Decorator::operation();
        cout << "ConcreteDecoratorB operation." << endl;
    }
};

int main() {
    Component* comp = new ConcreteComponent();
    comp->operation();

    Component* dec1 = new ConcreteDecoratorA(comp);
    dec1->operation();

    Component* dec2 = new ConcreteDecoratorB(dec1);
    dec2->operation();

    delete comp;
    delete dec1;
    delete dec2;

    return 0;
}

在这个示例中,基础组件类Component定义了一个纯虚函数operation(),表示组件的操作。具体组件类ConcreteComponent实现了Component接口,并且实现了具体的操作。

装饰器基类Decorator也继承了Component接口,并且包含一个指向被装饰对象的指针component,它的实现中调用了被装饰对象的operation()方法。具体装饰器类ConcreteDecoratorAConcreteDecoratorB分别继承了Decorator,并且在调用被装饰对象的operation()方法之后,添加了自己的操作。

main()函数中,首先创建了一个具体组件对象comp,然后使用具体装饰器类ConcreteDecoratorAConcreteDecoratorB对其进行装饰,并且调用了它们的operation()方法。在运行时,将看到输出如下:

ConcreteComponent operation.
ConcreteComponent operation.
ConcreteDecoratorA operation.
ConcreteDecoratorB operation.

在这个示例中,我们可以看到装饰器模式的实际应用。在不改变原始对象的情况下,可以通过添加一个或多个装饰器对象,来扩展原始对象的功能。这种方式非常灵活,因为可以在运行时动态地添加或删除装饰器对象,从而达到不同的效果。

下面是面试中关于装饰器模式的常见的问题:

  1. 你认为装饰器模式是什么?它的作用是什么?

  2. 装饰器模式与继承有什么区别?你能给出一个例子说明这两种方法的区别吗?

  3. 装饰器模式中的四个角色分别是什么?它们各自的作用是什么?

  4. 你是否在实际项目中使用过装饰器模式?可以分享一下你的经验吗?

  5. 装饰器模式的优缺点是什么?你认为在哪些场景下可以使用装饰器模式?

可以尝试自己思考一下,你的看法是什么,然后再看看答案,对比一下,看看有什么遗漏的地方=v=.

下面是问题的答案:

  1. 装饰器模式是一种结构型设计模式,它允许在运行时动态地添加或删除对象的行为,而不需要修改其源代码。它的作用是通过包装原始对象来扩展其功能,从而使代码更加灵活和易于维护。

  2. 装饰器模式通过包装原始对象来扩展其功能,而不需要修改其源代码。而继承则是通过创建子类来扩展父类的功能。装饰器模式具有更高的灵活性,可以在运行时动态添加或删除对象的行为,而继承则需要在编译时确定子类的行为。例如,如果要为一个类添加新的行为,使用继承需要创建一个新的子类来扩展父类的功能,而使用装饰器模式可以在运行时动态添加新的行为。

  3. 装饰器模式中的四个角色分别是:抽象组件(Component)、具体组件(ConcreteComponent)、抽象装饰器(Decorator)和具体装饰器(ConcreteDecorator)。其中,抽象组件定义了对象的基本行为,具体组件是实现抽象组件接口的类,抽象装饰器是所有装饰器的基类,具体装饰器是实现抽象装饰器接口的类。

  4. 在实际项目中,我曾经使用装饰器模式来扩展一个电商平台的订单处理系统。由于平台的订单类型非常多,而且不断有新的订单类型出现,为了保证代码的灵活性和可扩展性,我们使用装饰器模式来动态地添加或删除订单的行为,从而满足不同类型订单的需求。

  5. 装饰器模式的优点是可以在运行时动态地添加或删除对象的行为,从而使代码更加灵活和易于维护。它还遵循了开放封闭原则,即对扩展开放,对修改关闭。同时,装饰器模式还可以避免类爆炸问题,即避免创建大量的子类来扩展对象的行为。

    然而,装饰器模式也有一些缺点。首先,它可能会导致过度使用装饰器,从而导致代码的复杂性和可读性降低。其次,由于装饰器模式增加了许多小类,因此它可能会导致代码库的大小增加。此外,装饰器模式还可能影响程序的性能,因为它需要在运行时动态地创建和组合对象。

    总之,装饰器模式是一种非常有用的设计模式,可以帮助我们扩展对象的功能,从而使代码更加灵活和易于维护。它的应用场景包括但不限于:需要动态地添加或删除对象的行为,需要避免类爆炸问题,需要遵循开放封闭原则等。

欢迎大家讨论留言,批评指正,共同学习,共同进步!

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

五百五。

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

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

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

打赏作者

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

抵扣说明:

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

余额充值