装饰者模式(decorator pattern)

博客介绍了装饰者模式,它能在运行时往类中添加新行为,区别于继承在编译时添加。以星巴克咖啡为例,说明若每种搭配设为类会导致类爆炸,引出装饰者模式。还提到其特征是装饰者和被装饰对象有相同超类型,并给出参考链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

装饰者模式:

    能够动态地往一个类中添加新的行为。相比继承是在编译时添加行为,装饰模式是在运行时添加行为。

星巴克咖啡是讲述装饰者模式的一个很好的例子。

    假设现在有两种咖啡:HouseBlend、DarkRoast,同时有两种调料:Milk、Mocha。那么此时我们可以给顾客提供以下咖啡:

HouseBlend、HouseBlendWithMilk、HouseBlendWithMocha、HouseBlendWithMilkandMocha、

DarkRoast、DarkRoastWithMilk、DarkRoastWithMocha、DarkRoastWithMilkandMocha。如果每种搭配都是一个类,那么随着咖啡和调料种类的增加,将会出现类爆炸:

此时装饰者模式应运而生,结构图如下:

C++实现:

class Coffee {
public:
    virtual double getCost() = 0;
    virtual string getDescription() = 0;
};

class HouseBlend : public Coffee {
public:
    double getCost() { return 1.24; }
    string getDescription() { return "HouseBlend"; }
};

class DarkRoast : public Coffee {
public:
    double getCost() { return 2.73; }
    string getDescription() { return "DarkRoast"; }
};

class CoffeeDecorator : public Coffee {
private:
    Coffee *decoratedCoffee;
public:
    CoffeeDecorator(Coffee *c): decoratedCoffee(c) {}
    double getCost() { return decoratedCoffee->getCost(); }
    string getDescription() { return decoratedCoffee->getDescription(); }
};

class Milk : public CoffeeDecorator {
public:
    Milk(Coffee *c): CoffeeDecorator(c) {}
    double getCost() { return CoffeeDecorator::getCost() + 0.5; }
    string getDescription() {return CoffeeDecorator::getDescription() + ", Milk"; }
};

class Mocha : public CoffeeDecorator {
public:
    Mocha(Coffee *c): CoffeeDecorator(c) {}
    double getCost() { return CoffeeDecorator::getCost() + 0.7; }
    string getDescription() {return CoffeeDecorator::getDescription() + ", Mocha"; }
};

int main()
{
    Coffee *pc = new HouseBlend;
    cout << "description: " << pc->getDescription() << "  cost: " << pc->getCost() << endl;
    pc = new Milk(pc);
    cout << "description: " << pc->getDescription() << "  cost: " << pc->getCost() << endl;
    pc = new Mocha(pc);
    cout << "description: " << pc->getDescription() << "  cost: " << pc->getCost() << endl;
    delete pc;
}

装饰者模式的一个特征是:装饰者和被装饰对象具有相同的超类型。

reference:

Decorator in C++: Before and after

 

转载于:https://www.cnblogs.com/gattaca/p/4737586.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值