0
点赞
收藏
分享

微信扫一扫

设计模式实验考试


《软件体系结构》实验考试
注意:考试时间为100分钟,请认真作答。如给出的回答区域不够,可自行调整表格长度,务必保证美观大方。程序可以加入必要注释来解释说明内容。

问题描述:
快餐套餐一般含有主食、饮料、点心三部分组成,KFC快餐套餐与Mcdonald快餐套餐的生成过程大致都是一样的。每份套餐由主食、饮料、点心三部分组成,当每部分具体的食品可能不同,如主食可能是鸡肉卷、汉堡等,即对象的各组成部分可能因为需求的变化面临剧烈的变化。请通过程序描述KFC和Mcdonald生成出所谓的"快餐套餐"。
根据问题描述完成如下题目:
(1)选择的设计模式。(10分)

建造者模式

(2)说明采用该设计模式的好处。(20分)

1.客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。
具体的建造者类之间是相互独立的,这有利于系统的扩展。
2.每一个具体建造者都独立,因此可以方便地替换具体建造者或增加新的具体建造者, 用户使用不同的具体建造者即可得到不同的产品对象 。
3.可以更加精细地控制产品的创建过程 。将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程。
4.增加新的具体建造者无须修改原有类库的代码,指挥者类针对抽象建造者类编程,系统扩展方便,符合“开闭”。
5.使得建造代码与表示代码分离,由于建造者隐藏了该产品是如何组装的,所以若需要改变一个产品的内部表示,只需再定义一个具体的建造者就可以了。

(3)画出UML类图。(20分)

设计模式实验考试_c++

(4)写出源码。语言不限,Java、C++、Python、C#等均可。(50分)

#include<bits/stdc++.h>
using namespace std;
//快餐套餐的基本属性类
class Meal
{
public:
void setFood(const string& food)
{
m_food = food;
cout << "上"<< food << endl;
}
void setDrink(const string& drink)
{
m_drink = drink;
cout << "上"<< drink << endl;
}
void setSnack(const string& snack)
{
m_snack = snack;
cout << "上"<< snack << endl;
}
private:
string m_food;//主食
string m_drink;//饮料
string m_snack;//点心
};
//快餐套餐的生产步骤的抽象接口类
class MealBuilder
{
public:
virtual void buildFood() = 0;
virtual void buildDrink() = 0;
virtual void buildSnack() = 0;
virtual Meal* getMeal() = 0;
};
//KFC快餐套餐的具体生产步骤类
class KFCMealBuilder : public MealBuilder
{
public:
KFCMealBuilder()
{
m_meal = new Meal();
cout << "肯德基快餐准备好了。。。" << endl;
}
virtual void buildFood()
{
m_meal->setFood("鸡肉卷");
}
virtual void buildDrink()
{
m_meal->setDrink("可口可乐");
}
virtual void buildSnack()
{
m_meal->setSnack("鸡米花");
}
virtual Meal* getMeal()
{
return m_meal;
}
private:
Meal* m_meal;
};
//Mcdonalds快餐套餐的具体生产步骤
class McDonalMealBuilder : public MealBuilder
{
public:
McDonalMealBuilder()
{
m_meal = new Meal();
cout << "麦当劳快餐准备好了。。。" << endl;
}
virtual void buildFood()
{
m_meal->setFood("汉堡包");
}
virtual void buildDrink()
{
m_meal->setDrink("可口可乐");
}

virtual void buildSnack()
{
m_meal->setSnack("炸薯条");
}
virtual Meal* getMeal()
{
return m_meal;
}
private:
Meal* m_meal;
};
//服务员类
//功能:控制快餐套餐的生产过程
class Waiter
{
public:
Waiter(MealBuilder* builder)
{
m_builder = builder;
}
void createMeal()
{
m_builder->buildFood();
m_builder->buildDrink();
m_builder->buildSnack();
cout << "快餐做完了。" << endl;
}
private:
MealBuilder* m_builder;
};
//Client类
int main()
{
//麦当劳
Waiter McDonalWaiter(new McDonalMealBuilder());
McDonalWaiter.createMeal();
//肯德基
Waiter KFCWaiter(new KFCMealBuilder());
KFCWaiter.createMeal();
return 0;
}


举报

相关推荐

0 条评论