阅读下列说明和Java代码,将应填入(n)处的字句写在答题纸的对应栏内。 【说明】 某饭店在不同的时段提供多种不同的餐饮,其菜单的结构图如图10.43所示。 现在采用组合(Composition)模式来构造该饭店的菜单,使得饭店可

admin2018-07-25  42

问题 阅读下列说明和Java代码,将应填入(n)处的字句写在答题纸的对应栏内。
    【说明】
    某饭店在不同的时段提供多种不同的餐饮,其菜单的结构图如图10.43所示。

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

【Java代码】
import java.util.*
_____(1) MenuComponent{
    protected String name;
    _____(2);//添加新菜单
  public abstract void print();    //打印菜单信息
  public String getName(){return name;}
}
class MenuItem extends MenuC0mponent{
    private double price;
    public MenuItem(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());
    }
  }
  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 menuComponent=(MenuComponent)iterator.next();
    _____(4);
    }
    }
  }
  class MenuTestDrive{
    public static void main(String args[]){
    MenuComponent  al1Menus=new Menu(’’ALL MENUS’’);
    MenuComponent dinerMenu=new Menu(’’DINER MENU’’);
    …//创建更多的Menu对象,此处代码省略
    allMenus.add(dinerMenu);  //将dinerMenu添加到餐厅菜单中
    …//为餐厅增加更多的菜单,此处代码省略
    _____(5);//打印饭店所有菜单的信息
    }
}

选项

答案(1)abstract class或public abstract class (2)public abstract void add(MenuComponent menuComponent)或abstract void add(MenuComponent menuComponent)或protected abstract void add(MenuComponent menuComponent) (3)add(menuComponent) (4)menuComponent.print() (5)allMenus.print()

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

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

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