设计模式实验考试

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

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

建造者模式

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

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

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

设计模式实验考试_第1张图片

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

#include
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;
}

你可能感兴趣的:(设计模式)