阅读下列说明和C++代码,将应填入(n)处的字句写在对应栏内。 [说明] 某饭店在不同的时段提供多种不同的餐饮,其菜单的结构图如图5-1所示。 现在采用组合(Composition)模式来构造该饭店的菜单,使得饭店可以方便地在其中增加新的

admin2012-03-21  30

问题 阅读下列说明和C++代码,将应填入(n)处的字句写在对应栏内。
   [说明]
   某饭店在不同的时段提供多种不同的餐饮,其菜单的结构图如图5-1所示。

  现在采用组合(Composition)模式来构造该饭店的菜单,使得饭店可以方便地在其中增加新的餐饮形式,得到如图5-2所示的类图。其中MenuComponent为抽象类,定义了添加(add)新菜单和打印饭店所有菜单信息(print)的方法接口。类Menu表示饭店提供的每种餐饮形式的菜单,如煎饼屋菜单、咖啡屋菜单等。每种菜单中都可以添加子菜单,例如图5-1中的甜点菜单。类MenuItem表示菜单中的菜式。
[C++代码]
   #include<iostream>
   #include<list>
   #include<string>
   using namespace std;
   clas s MenuComponent  {
   protected: string name;
   public:
   MenuComponent(string name)  {this->name=name;  }
   String getName(){return name;}
     (1)  :    //添加新菜单
   virtual void print()=0;    //打印菜单信息
   };
   clasS MenuItem: public MenuComponent  {
   private: double price;
   public:
   Menultem(string name, double price): MenuComponent(name){this->price=price;}
   double getPrice(){return price;}
   void add(MenuComponent* menuComponent)  {return;  }  //添加新菜单
   void print()  { cout<<"    "<<getName()<<", "<<getPrice()<<end1;}
   };
   clasS Menu: public MenuComponent  {
   private: list<  (2)  > menuComponents;
   pubiic:
   Menu(string name): MenuC0mponent(name){}
   void add(MenuComponent* menuComponent)    //添加新菜单
   {  (3)  ;  }
   void print(){
   cout<<"\n"<<getName()<<"\n-------------------------"<<end1;
   std::list<MenuC0mponent*>::iterator iter;
   for(iter=menuComponents.begin(); iter!=menuComponents. end(); iter++)
     (4)  ->print();
   }
   };
   void main(){
   MenuComponent* allMenus=new Menu("ALL MENUS");
   MenuComponent* dinerMenu=new Menu("DINER MENU");
   …//创建更多的Menu对象,此处代码省略
   allMenus->add(dinerMenu);    //将dinerMenu添加到餐厅菜单中
   …//为餐厅增加更多的菜单,此处代码省略
     (5)  ->print();    //打印饭店所有菜单的信息
   }
(5)

选项

答案allMonus

解析 Composite模式将对象组合成树形结构以表示“整体-部分”的层次结构,其中的组合对象使得你可以组合基元对象以及其他的组合对象,从而形成任意复杂的结构。Composite模式使得用户对单个对象和组合对象的使用具有一致性。
   Composite模式的结构下图所示。

其中:
   ·类Component为组合中的对象声明接口,在适当的情况下,实现所有类共有接口的缺省行为,声明一个接口用于访问和管理Component的子部件;
   ·类Leaf在组合中表示叶节点对象,叶节点没有子节点;并在组合中定义图元对象的行为;
   ·类Composite定义有子部件的那些部件的行为,存储子部件,并在Component接口中实现与子部件有关的操作;
   ·类Client通过Component接口操纵组合部件的对象。
   下列情况可以使用Composite模式:
   (1)表示对象的整体.部分层次结构;
   (2)希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。
   试题五将组合模式应用到饭店菜单的构造中。图5-2中的类MenuComponent对应上图中的Component,MenuItem对应Leaf,Menu对应Composite。在实现时,通常都会把Component定义为抽象类。
   在C++中,抽象类是指至少包含一个纯虚拟函数的类。类MenuComponent中已经包含了一个纯虚拟函数print,所以MenuComponent已经是一个抽象类了。(1)处根据注释,这里应该定义功能为“添加新菜单”的成员函数。在子类MenuItem和Menu中可以看到,都有add成员函数,说明子类中重置了父类中的成员函数。所以(1)处的成员函数也应该定义为纯虚拟函数,即virtual、void add(MenuComponent* menuComponent)=0。
   由图5-2可以看出,Menu中包含了MenuComponent,的对象集合。程序中用C++标准模板库中的list来实现这个聚集关系。因此(2)处应填入MenuComponent*。由于使用了list,就可以利用list中提供的各种方法了。list中用于添加元素的方法是push_back所以(3)处应填入menuComponents.push_back(menuComponent)。
   (4)处出现在方法print中,其功能是打印出所有菜单的信息。这里使用了list中的迭代器类iterator,遍历每个子菜单,并调用子菜单中定义的print方法打印该子菜单的信息。(4)处应填入*iter。
   为了能够在main中打印出所有的菜单信息,必须使用表示菜单结构中最顶层菜单的对象来调用print,因此(5)处应填入allMenus。
转载请注明原文地址:https://jikaoti.com/ti/U3i7FFFM
0

相关试题推荐
最新回复(0)