问题 填空题

阅读下列说明和Java代码,将应填入 (n) 处的字句写在对应栏内。

[说明]

某饭店在不同的时段提供多种不同的餐饮,其菜单的结构图如图6-1所示。

现在采用组合(Composition)模式来构造该饭店的菜单,使得饭店可以方便地在其中增加新的餐饮形式,得到如图6-2所示的类图。其中MenuComponent为抽象类,定义了添加(add)新菜单和打印饭店所有菜单信息(print)的方法接口。类Menu表示饭店提供的每种餐饮形式的菜单,如煎饼屋菜单、咖啡屋菜单等。每种菜单中都可以添加子菜单,例如图6-1中的甜点菜单。类MenuItem表示菜单中的菜式。

[Java代码]

import Java.util.*;

(1) MenuComponent

protected String name;

(2) ;//添加新菜单

public abstract void print(); //打印菜单信息

public String getName()return name;

class MenuItem extends MenuComponent

private double price;

public Menultem(String name, double price)

this.name=name; this.price=price;

public double getPrice() return price;

public void add(MenuComponent menuComponent)return;//添加新菜单

public void print()

System.out.print(""+getName());

System.out.println(","+getPrice());

class Menu extends MenuComponent

private List<MenuComponent>menuComponents=new ArrayList<MenuComponent>();

public Menu(String name)this.name=name;

public void add(MenuComponent menuComponent) //添加新菜单

menuComponents. (3) ;

publiC void print()

System.out.print(“\n"+getName());

System.out.println(","+"-------------------------");

Iterator iterator=menuComponents.iterator();

while(iterator.hasNext())

MenuComponent menuC0mponent=(MenuComponent)iterator.next();

(4) ;

Class MenuTestDrive

public static void main(String args[])

MenuComponent allMenus=new Menu("ALL MENUS");

MenuComponent dinerMenu=new Menu("DINER MENU");

…//创建更多的Menu对象,此处代码省略

allMenus. add(dinerMenu); //将dinerMenu添加到餐厅菜单中

…//为餐厅增加更多的菜单,此处代码省略

(5) ; //打印饭店所有菜单的信息

文中(5)处应为()。

答案

参考答案:allMenus.print()

解析:

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

Composite模式的结构下图所示。

其中:

·类Component为组合中的对象声明接口,在适当的情况下,实现所有类共有接口的缺省行为,声明一个接口用于访问和管理Component的子部件;

·类Leaf在组合中表示叶节点对象,叶节点没有子节点;并在组合中定义图元对象的行为;

·类Composite定义有子部件的那些部件的行为,存储子部件,并在Component接口中实现与子部件有关的操作;

·类Client通过Component接口操纵组合部件的对象。

下列情况可以使用Composite模式:

(1)表示对象的整体-部分层次结构;

(2)希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

试题六将组合模式应用到饭店菜单的构造中。图6-2中的类MenuComponent对应上图中的Component,MenuItem对应Leaf,Menu对应Composite。在实现时,通常都会把Component定义为抽象类。

在Java中,用abstract关键字限定的类即为抽象类,所以(1)处应填入abstract class。(2)处根据注释,这里应该定义功能为“添加新菜单”的成员函数。在子类MenuItem和Menu中可以看到,都有add成员函数,说明予类中重置了父类中的成员函数。所以(2)处应填入public abstract void add(MenuComponent menucomponent)。

由图6-2可以看出,Menu中包含了MenuComponent的对象集合。程序中用Java中的list来实现这个聚集关系,这样就可以利用list中提供的各种方法了。list中用于添加元素的方法是add,所以(3)处应填入add(menuComponent)。

(4)处出现在方法print中,其功能是打印出所有菜单的信息。这里使用了list中的迭代器类iterator,遍历每个子菜单,并调用子菜单中定义的print方法打印该子菜单的信息。(4)处应填入menuComponent.print()。

为了能够在main中打印出所有的菜单信息,必须使用表示菜单结构中最项层菜单的对象来调用print,因此(5)处应填入allMenus.print()。

单项选择题
单项选择题