如何为菜单实现OOP解决方案



您可以建议使用此问题的OO设计:

需要实现菜单。

菜单具有n个选项:(从0-N(

  • 0-是从当前级别出口到最后一个级别。

  • [1-n]是动作。

行动可以是:

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

2(执行任务(以接口合同为nume:doaction((。

,因此您需要层次结构化的"节点",并且每个节点都有与之相关的动作。我将创建一个包含所有这些行为的单一模型(在Java中(:

public interface MenuItem {
    MenuItem parent();
    Iterable<MenuItem> children();
    String name();
    void proceed();
}

'parent((''和'children(('方法在树上或下导航,名称((只是节点的可打印名称,然后继续((实际运行一个过程。一个可能的实现是将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();
    }
}

最新更新