装饰者模式:
动态地将功能附加到对象上, 而不是来一个继承大爆炸.
#include
#include
//drink
class Beverage
{
public:
Beverage () = default;
Beverage (string description_) :description (description_) {}
virtual ~Beverage () = default;
virtual string get_description ()
{
return description;
}
virtual double cost () = 0;
protected:
string description = "Unknow Beverage";
};
class condiment_decorator : public Beverage
{
public:
virtual string get_description () override = 0;
};
class Espresso : public Beverage
{
public:
Espresso () :Beverage("Esptrsso") {}
double cost ()override
{
return 1.99;
}
};
class house_blend : public Beverage
{
public:
house_blend () :Beverage ("house blend coffee") {}
double cost ()override
{
return 0.89;
}
};
class Mocha : public condiment_decorator
{
public:
Mocha (shared_ptr
beverage_) :beverage (beverage_) {}
string get_description ()override
{
return string (beverage->get_description () + "Mocha");
}
double cost ()override
{
return 0.2 + beverage->cost ();
}
private:
shared_ptr
beverage;
};
void test ()
{
shared_ptr
beverage1 = make_shared
(); cout << beverage1->get_description () << " $" << beverage1->cost () << endl; shared_ptr
beverage2 = make_shared
(); beverage2 = make_shared
(beverage2); cout << beverage2->get_description () << " $" << beverage2->cost () << endl; } int main () { ios::sync_with_stdio (false); test (); return 0; }