如何从装饰项中删除图层
How to remove a layer from a decorated item?
本文关键字:删除图层 更新时间:2023-10-16
如何删除使用装饰器设计模式添加的项目?诸如删除最低/最高成本项目或指向它之类的事情?
例如,假设我有:
class Beverage
{
private:
string description;
double cost;
public:
virtual string getDescription() { return description; }
virtual double cost() { return cost };
};
class Espresso : public Beverage
{
public:
string getDescription()
{
return "Espresso";
}
double cost()
{
return 1.99;
}
};
class condimentDecorator : public Beverage
{
public:
virtual string getDescription() = 0;
};
class Whip : public condimentDecorator
{
private:
Beverage* beverage;
public:
Whip(Beverage* beverage)
{
this->beverage = beverage;
}
double cost()
{
return beverage->cost() + 0.20;
}
};
class Milk : public condimentDecorator
{
private:
Beverage* beverage;
public:
Milk(Beverage* beverage)
{
this->beverage = beverage;
}
string getDescription()
{
return beverage->getDescription() + ", Milk";
}
double cost()
{
return beverage->cost() + 0.10;
}
};
class Soy : public condimentDecorator
{
private:
Beverage* beverage;
public:
Soy(Beverage* beverage)
{
this->beverage = beverage;
}
string getDescription()
{
return beverage->getDescription() + ", Soy";
}
double cost()
{
return beverage->cost() + 0.15;
}
};
我要做的是:
Beverage* coffee = new Espresso();
coffee = new Whip(coffee);
coffee = new Milk(coffee);
coffee = new Soy(coffee);
我怎样才能将鞭子作为成本最高的项目,我怎样才能删除它?
我怎么能在不知道成本最高的项目的情况下找到它是什么?例如,我怎么会知道它一开始就有鞭子?有没有办法检查它有什么额外的内容,然后删除最高的成本项目?
您需要 Beverage 来实现getBaseBeverage()
方法,返回自身,调味品装饰器需要覆盖该方法,返回beverage
。
Beverage *base = coffee->getBaseBeverage();
if (base != coffee) {
double cost = coffee->cost() - base->cost();
}
这得到了最后一个装饰器的成本。 您可以重复该操作以获取每个先前装饰器的成本(可能是循环),并记录最大的装饰器成本。
删除装饰器需要创建一个新的装饰器链,跳过要删除的项目,而是链接到该项目的 getBaseBeverage()。
这些都不容易,无需对您提供的类进行重大更改。 您可以向 Beverage 添加一个返回装饰器列表的函数。 您可以添加一个函数来返回每个装饰器的增量成本。 您甚至可以添加一个功能来从饮料中删除特定的装饰器。 但是,您已经远远超出了"装饰器"类型的模式,而完全不同。
相关文章:
- 如何在千层面打印隐藏图层的输出
- 使用几何着色器的图层渲染似乎只输出图像数组的第一层
- 图层不会绘制另一个图层
- 在作为表后面图层的标签上绘图
- 在 caffe 中仅编译一个图层文件
- 如何在咖啡中提取图层的斑点信息?
- 如何在 c++ 中获取图层的顶部标签?
- 在 Cocos2D-X 中创建具有新成员的图层
- 面向对象的图层
- 跨多个图层的模板化类未知类型
- 如何从装饰项中删除图层
- 存储 SDL 渲染器的预定义图层
- X11 图层管理器
- QGraphicsView上的图层
- 图层下降和更新咖啡模型
- 错误:从类型为"图层"的表达式初始化类型"LineLayer&"的引用无效
- 如何结束模板图层
- 如何创建包含不同图层的 PDF 文件
- 我如何在cocos2d-x中获得相同场景中的其他图层?
- 在cocos2d-x中使用许多图层进行触摸处理