Oop 如何实现菜单的面向对象解决方案

Oop 如何实现菜单的面向对象解决方案,oop,Oop,你能为这个问题提出一个oo设计建议吗: 需要实现一个菜单 该菜单有n个选项:从0到n 0-从当前级别退出到最后一个级别 [1-n]是行动 行动可以是: 1打开具有相同行为的新子菜单 2执行一个任务,比如说通过名为:doAction的接口契约执行任务。因此您需要分层组织的节点,每个节点都有一些与之相关的操作。我将创建这样一个MenuItem模型,其中包含java中的所有行为: public interface MenuItem { MenuItem parent(); Itera

你能为这个问题提出一个oo设计建议吗:

需要实现一个菜单

该菜单有n个选项:从0到n

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

[1-n]是行动

行动可以是:

1打开具有相同行为的新子菜单


2执行一个任务,比如说通过名为:doAction的接口契约执行任务。

因此您需要分层组织的节点,每个节点都有一些与之相关的操作。我将创建这样一个MenuItem模型,其中包含java中的所有行为:

public interface MenuItem {
    MenuItem parent();

    Iterable<MenuItem> children();

    String name();

    void proceed();
}
“parent”和“children”方法在树上或树下导航,name只是节点的一个可打印名称,procedure实际上运行一个过程。一种可能的实现是封装一个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();
    }
}

您对可能的方法本身感兴趣还是想要一个实际的例子?提及您正在使用/愿意使用的编程语言会带来更具体的答案