如何实现菜单的oop解决方案

时间:2018-02-07 11:04:54

标签: oop

你可以为这个问题建议一个oo设计:

需要实现一个菜单。

菜单有n个选项:(从0-n开始)

  • 0 - 从当前级别退出到最后一级。

  • [1-n]是行动。

行动可以是:

1)打开一个具有相同行为的新子菜单。

2)执行一项任务(比如说接口合同名为:doAction()。

1 个答案:

答案 0 :(得分:1)

因此,您需要按层次结构组织的“节点”,并且每个节点都有一些与之关联的操作。我会创建一个包含所有这些行为的单个MenuItem模型(在java中):

public interface MenuItem {
    MenuItem parent();

    Iterable<MenuItem> children();

    String name();

    void proceed();
}

'parent()'和'children()'方法在树中向上或向下导航,name()只是节点的可打印名称,proceed()实际运行一个过程。一种可能的实现方式是封装XML文档,该文档是按设计分层的,包含名称和ID的节点以及将id与操作相关联的映射,因此类似于以下代码(在java中):

public final class XmlMenuItem implements MenuItem {
    private final String id;
    private final Document xml;
    private final Map<String, Runnable> actions;

    public XmlMenuItem(String id, Document xml, Map<String, Runnable> actions) {
        this.id = id;
        this.xml = xml;
        this.actions = actions;
    }

    @Override
    public MenuItem parent() {
        Element parent = Element.class.cast(xml.getElementById(id).getParentNode());
        return new XmlMenuItem(parent.getAttribute("id"), xml, actions);
    }

    @Override
    public Iterable<MenuItem> children() {
        List<MenuItem> result = new ArrayList<>();
        NodeList children = xml.getElementById(id).getChildNodes();
        for (int i = 0; i < children.getLength(); i++) {
            result.add(new XmlMenuItem(Element.class.cast(children.item(0)).getAttribute("id"), xml, actions);
        }
        return result;
    }

    @Override
    public String name() {
        return xml.getElementById(id).getTextContent();
    }

    @Override
    public void proceed() {
        actions.get(id).run();
    }
}