软工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

相关推荐
有梦想的咸鱼_1 分钟前
go实现并发安全hashtable 拉链法
开发语言·golang·哈希算法
海阔天空_20136 分钟前
Python pyautogui库:自动化操作的强大工具
运维·开发语言·python·青少年编程·自动化
天下皆白_唯我独黑13 分钟前
php 使用qrcode制作二维码图片
开发语言·php
小灰灰__14 分钟前
IDEA加载通义灵码插件及使用指南
java·ide·intellij-idea
夜雨翦春韭17 分钟前
Java中的动态代理
java·开发语言·aop·动态代理
小远yyds19 分钟前
前端Web用户 token 持久化
开发语言·前端·javascript·vue.js
何曾参静谧31 分钟前
「C/C++」C/C++ 之 变量作用域详解
c语言·开发语言·c++
程序媛小果38 分钟前
基于java+SpringBoot+Vue的宠物咖啡馆平台设计与实现
java·vue.js·spring boot
追风林43 分钟前
mac m1 docker本地部署canal 监听mysql的binglog日志
java·docker·mac
芒果披萨1 小时前
El表达式和JSTL
java·el