動態地給一個物件新增一些額外的職責。就增加功能來說,Decorator 模式相比生成子類更為靈活。

Component* 指標,實作 Operation() 時委派給被裝飾物件,並可在前後添加行為。AddedBehavior()。new DecoratorB(new DecoratorA(new Component)))。#ifndef DECORATOR_H
#define DECORATOR_H
class Component {
public:
Component() {}
virtual ~Component() {}
virtual void Operation() = 0;
};
class Decorator : public Component {
public:
Decorator(Component* pComponent) : m_pComponent(pComponent) {}
virtual ~Decorator();
protected:
Component* m_pComponent;
};
class ConcreteComponent : public Component {
public:
ConcreteComponent() {}
virtual ~ConcreteComponent() {}
virtual void Operation();
};
class ConcreteDecorator : public Decorator {
public:
ConcreteDecorator(Component* pComponent) : Decorator(pComponent) {}
virtual ~ConcreteDecorator() {}
virtual void Operation();
private:
void AddedBehavior();
};
#endif
#include "Decorator.h"
#include <iostream>
Decorator::~Decorator() { delete m_pComponent; m_pComponent = nullptr; }
void ConcreteComponent::Operation() {
std::cout << "Operation of ConcreteComponent\n";
}
void ConcreteDecorator::Operation() {
m_pComponent->Operation(); // 委派核心行為
AddedBehavior(); // 新增職責
}
void ConcreteDecorator::AddedBehavior() {
std::cout << "AddedBehavior of ConcreteDecorator\n";
}
#include "Decorator.h"
#include <cstdlib>
int main() {
Component* pComponent = new ConcreteComponent();
Decorator* pDecorator = new ConcreteDecorator(pComponent); // 動態裝飾
pDecorator->Operation();
delete pDecorator;
return 0;
}
| 維度 | 繼承 | 裝飾模式 | 策略模式 |
|---|---|---|---|
| 靈活性 | 靜態、編譯期固定 | 動態、執行期組合 | 動態、執行期切換 |
| 疊加行為 | 難(多重繼承複雜) | 易(多層包裹) | 單一策略(可組合策略) |
| 介面一致性 | 是 | 是(透明) | 策略介面一致 |
| 適用場景 | 「是一種」關係 | 「有額外職責」關係 | 「演算法可替換」關係 |
std::ostream 裝飾 std::ofstream/std::ostringstream)。std::function 組合裝飾器鏈(如 HTTP 中介軟體)。