所以,我需要使用装饰器dessign模式编写一个示例代码,这是我的例子,它非常简单但是idk为什么它不打印我想要的东西。 我是新来的,这是我的第一个问题,如果我以正确的方式做到这一点,但这里是C ++中的代码:
include < iostream >
using namespace std;
class CafeAbstracto {
protected:
int size;
int precio;
public:
void setsize(int n) {
this->size = n;
this->precio = n*10;
}
void setprecio(int p) {
this->precio += p;
}
int getprecio(){
return this->precio;
}
virtual void imprimirprecio(void) = 0;
};
class Cafe : public CafeAbstracto {
public:
void imprimirprecio() {
int prec=getprecio();
cout << "El precio del cafe es de: " << prec << endl;
}
};
class CafeDecorator : public CafeAbstracto {
protected:
CafeAbstracto *Cafe_con_extras;
public:
CafeDecorator(CafeAbstracto *nuevo_cafe) {
Cafe_con_extras = nuevo_cafe;
}
virtual void imprimirprecio()=0;
};
class Leche : public CafeDecorator {
public:
Leche(CafeAbstracto* nuevo_cafe, bool tiene) : CafeDecorator(nuevo_cafe) {
}
void imprimirprecio() {
cout << "El cafe tiene leche" << endl;
Cafe_con_extras->setprecio(5240);
Cafe_con_extras->imprimirprecio();
}
};
class Azucar : public CafeDecorator {
public:
Azucar(CafeAbstracto* nuevo_cafe, bool tiene) : CafeDecorator(nuevo_cafe) {
}
virtual void imprimirprecio() {
Cafe_con_extras->setprecio(50);
cout << "El cafe tiene azucar" << endl;
Cafe_con_extras->imprimirprecio();
}
};
class Descafeinado : public CafeDecorator {
public:
Descafeinado(CafeAbstracto* nuevo_cafe, bool es) : CafeDecorator(nuevo_cafe) {
}
void imprimirprecio() {
Cafe_con_extras->setprecio(100);
cout << "El cafe es descafeinado" << endl;
Cafe_con_extras->imprimirprecio();
}
};
int main(int argc, char *argv[]) {
Cafe *coffee = new Cafe();
coffee->setsize(6);
Descafeinado *cafedescaf = new Descafeinado(coffee, true);
cafedescaf->imprimirprecio();
Leche *descafyconleche = new Leche(cafedescaf, true);
descafyconleche->imprimirprecio();
Azucar *cafe_des_leche= new Azucar(descafyconleche, true);
cafe_des_leche->imprimirprecio();
delete coffee;
delete cafedescaf;
delete descafyconleche;
delete cafe_des_leche;
return (0);
}
这是输出
El cafe es descafeinado El precio del cafe es de:160 //这个是正确的
El cafe tiene leche El cafe es descafeinado El precio del cafe es de:260 //不正确
El cafe tiene azucar El cafe tiene leche El cafe es descafeinado El precio del cafe es de:360 //不正确
答案 0 :(得分:1)
Leche *descafyconleche = new Leche(cafedescaf, true);
descafyconleche->imprimirprecio();
Azucar *cafe_des_leche= new Azucar(descafyconleche, true);
cafe_des_leche->imprimirprecio();
应该是:
Leche *descafyconleche = new Leche(coffee, true);
descafyconleche->imprimirprecio();
Azucar *cafe_des_leche= new Azucar(coffee, true);
cafe_des_leche->imprimirprecio();
因为您需要使用装饰器来装饰你的咖啡(你的具体组件),而不是装饰另一个装饰器。