软工2021上下午第六题(组合模式)
阅读下列说明和Java代码,将应填入(n)处的字句写在答题纸的对应栏内。
【说明】
层叠菜单是窗口风格的软件系统中经常采用的一种系统功能组织方式。层叠菜单中包含的可能是一个菜单项(直接对应某个功能),也可能是一个子菜单,现在采用组合(composite)设计模式实现层叠菜单,得到如图6-2所示的类图。
package cn.itcast.hotel.test;
import java.util.List;
abstract class MenuComponent {//构成层叠菜单的元素
(1) String name;
public void printName() {
System.out.println(name);
}
(2)
public abstract boolean removeMenuElement(MenuComponent element);
(3)
}
package cn.itcast.hotel.test;
import java.util.ArrayList;
import java.util.List;
/**
* @author lst
* @date 2023年11月28日 15:42
*/
class Menu extends MenuComponent {
(4)
public Menu(String name) {
this.name = name;
this.elementList = new ArrayList<>();
}
public boolean addMenuElement(MenuComponent element) {
return elementList.add(element);
}
public boolean removeMenuElement(MenuComponent element) {
return elementList.remove(element);
}
public List<MenuComponent> getElement() {
return elementList;
}
}
package cn.itcast.hotel.test;
import java.util.List;
/**
* @author lst
* @date 2023年11月28日 15:44
*/
class MenuItem extends MenuComponent {
public MenuItem(String name) {
this.name = name;
}
public boolean addMenuElement(MenuComponent element) {
return false;
}
public boolean removeMenuElement(MenuComponent element) {
return false;
}
public List<MenuComponent> getElement() {
return null;
}
}
package cn.itcast.hotel.test;
import java.util.List;
/**
* @author lst
* @date 2023年11月28日 15:45
*/
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 getElement()
(4)List elementList
(5)mainMenu.addMenuElement(subMenu)
答案解析:
本题是典型的组合模式应用。
首先根据类图中name标注的为#(+表示public,-表示private,#表示protected),第(1)空对name的修饰应该是protected。
然后根据抽象类和实现类的对应关系,可以补充第(2)(3)空,这两处缺失的方法根据下文代码进行补充,注意方法名必须用abstract修饰,并且注意抽象方法的写法没有具体方法体。其中第(2)空填写abstract boolean addMenuElement(MemuComponent element) ;
第(3)空填写abstract List getElement();
第(4)空缺失了一个属性,此时根据下文的同名构造函数会发现,此处传参给了this.name以及this.elementList,name可以根据父类继承使用,而elementList需要定义,因此此处缺失的参数是elementList,类型根据后面的赋值类型进行定义,即第(4)空填写List elementList。
第(5)空看懂逻辑mainmenu中添加subMenu