#include <iostream>
#include <string>
using namespace std;
class Meal
{
public :
void setFood(string food){
this ->food=food ;
}
string getFood(){
return this ->food;
}
void setDrink(string drink){
this ->drink=drink ;
}
string getDrink(){
return this ->drink;
}
private :
string food;
string drink;
};
class MealBuilder
{
public :
MealBuilder(){
meal= new Meal ();
}
virtual void buildFood()=0;
virtual void buildDrink()=0;
Meal * getMeal(){
return meal;
}
protected :
Meal * meal;
};
class SubMealBuilderA : public MealBuilder
{
public :
void buildFood(){
meal->setFood( "一个鸡腿堡" );
}
void buildDrink(){
meal->setDrink( "一杯可乐" );
}
};
class SubMealBuilderB : public MealBuilder
{
public :
void buildFood(){
meal->setFood( "一个鸡肉卷" );
}
void buildDrink(){
meal->setDrink( "一杯果汁" );
}
};
class KFCWaiter
{
public :
void setMealBuilder( MealBuilder* mb ){
this ->mb=mb ;
}
Meal * construct()
{
mb->buildFood();
mb->buildDrink();
return mb->getMeal();
}
private :
MealBuilder * mb;
};
int main()
{
MealBuilder * ma=new SubMealBuilderA();
KFCWaiter * waiter=new KFCWaiter();
waiter->setMealBuilder(ma);
Meal *meal=waiter->construct();
cout<< "套装组成A:" <<endl;
string food=meal->getFood();
string drink=meal->getDrink();
cout<<food<<endl;
cout<<drink<<endl;
delete meal;
delete ma;
MealBuilder *mb=new SubMealBuilderB();
waiter->setMealBuilder(mb);
Meal * mealb=waiter->construct();
cout<< "套装组成B:" <<endl;
string foodb=meal->getFood();
string drinkb=meal->getDrink();
cout<<foodb<<endl;
cout<<drinkb<<endl;
delete mealb;
delete mb;
delete waiter;
return 0;
}