阅读下列说明和Java代码,将应填入(n)处的字句写在答题纸的对应栏内。
【说明】
层叠菜单是窗口风格的软件系统中经常采用的一种系统功能组织方式。层叠菜单中包含的可能是一个菜单项(直接对应某个功能),也可能是一个子菜单,现在采用组合(composite)设计模式实现层叠菜单,得到如图6-2所示的类图。
import java.util.*;
abstract class MenuComponent{
//构成层叠菜单的元素
(1) String name;//菜单项或子菜单名称
public void printName(){
System.out.println(name);}
public (2);
public abstract boolean removeMenuElement(MenuComponent element);
public (3);
}
Class Menu extends MenuComponent{
public MenuItem(String name){
this.name=name;}
public boolean addComponent(MenuComponent element){
return false;}//(2)
public boolean removeComponent(MenuComponent element){
return false;}
public List<MenuComponent> getElement(){
return null;}//(3)
}
Class MenuItem extends MenuComponent{
public (4);
public MenuItem(String name){
this.name=name;
this.elementList = new ArrayList<MenuComponent>();
}
public boolean addMenuElement(MenuComponent element){
return elementList.add(element);
}
public boolean removeMenuElement(MenuComponent element){
return elementList.remove(element);
}
public List<MenuComponent> getElement(){
return elementList;}
}
Class CompositeTest{
public static void main(String[] args){
MenuComponent mainMenu = new Menu("Insert");
MenuComponent subMenu = new Menu("Chart");
MenuComponent element = new MenuItem("On This Sheet");
(5);
subMenu.addMenuElement(element);
printMenus(mainMenu);
}
private static void printMenus(MenuComponent ifile){
ifile.printName();
List<MenuComponent> children = ifile.getElement();
if(children==null) return;
for(MenuComponent element:children){
printMenus(element);
}
}
}
参考答案:
(1)protected
(2)abstract boolean addMenuElement(MemuComponent element)
(3)abstract List<MenuComponent> getElement()
(4)ArrayList<MenuComponent> elementList
(5)mainMenu.addMenuElement(subMenu)
答案解析:
本题是典型的组合模式应用。
首先根据类图中name标注的为#(+表示public,-表示private,#表示protected),第(1)空对name的修饰应该是protected。
然后根据抽象类和实现类的对应关系,可以补充第(2)(3)空,这两处缺失的方法根据下文代码进行补充,注意方法名必须用abstract修饰,并且注意抽象方法的写法没有具体方法体。其中第(2)空填写abstract boolean addMenuElement(MemuComponent element) ,第(3)空填写abstract List<MenuComponent> getElement()。
第(4)空缺失了一个属性,此时根据下文的同名构造函数会发现,此处传参给了this.name以及this.elementList,name可以根据父类继承使用,而elementList需要定义,因此此处缺失的参数是elementList,类型根据后面的赋值类型进行定义,即第(4)空填写ArrayList<MenuComponent> elementList。
第(5)空是对组合模式的应用拼装,根据下文可知打印需要调用mainMenu对象,而此时该对象是独立的,需要与其他菜单进行拼装,下文中subMenu拼装了element,此处需要将subMenu拼装到mainMenu,即第(5)空填写mainMenu.addMenuElement(subMenu)。