Шаблон для сопоставления общей структуры данных с определенной структурой данных - PullRequest
2 голосов
/ 08 февраля 2010

У меня есть иерархическая общая структура данных. Существует корневой узел, и под ним может быть много узлов дерева или только один узел данных, и узлы дерева могут иметь больше узлов дерева. Базовая древовидная структура.

Все данные в моей системе сохраняются в этом формате. Однако я хочу иметь строго типизированный интерфейс для некоторых типов данных, представляемых этими структурами данных (т. Е. Превратить общее иерархическое дерево в строго типизированную адресную запись).

Я планировал использовать шаблон адаптера, где я передаю узел адаптеру, а затем он выставляет свойства путем опроса дерева. Это также позволило бы мне проверить дерево (то есть, у которого есть определенные элементы и у них есть действительные данные в них). Это также обеспечивает расширяемость (т. Е. Само дерево также будет доступно, если будут добавлены дополнительные данные позднее).

Как вы думаете, это самый оптимальный подход для достижения этого или есть более простой способ?

Примечание: это в C # и .Net 4.0.

Спасибо!

1 Ответ

1 голос
/ 08 февраля 2010

Адаптер обычно используется для моста между двумя несовместимыми интерфейсами . Это, похоже, не ваша проблема здесь. На самом деле, я не вижу никаких проблем - поскольку объектные языки по своей природе иерархичны, вы должны иметь возможность использовать в основном взаимно-однозначное отображение между классом и узлом дерева.

Возможно, под "Адаптером" вы просто подразумеваете класс, который оборачивает Node или любой конкретный тип Object, который описывает узлы вашего дерева, и я бы согласился. Должны быть довольно очевидные отношения родитель-потомок, которые вы можете описать, имея собственные классы узлов или каким-либо образом возвращая массив дочерних узлов / классов и атрибуты как получатели / установщики. Любая необходимая проверка может быть выполнена установщиками или, если необходимо, во время построения, поскольку класс проверяет данный узел и его дочерние узлы. Примерно так:

public class NodeFu {

    private Node node;

    public NodeFu(Node node){
        this.node = node;
        // perhaps traverse and validate node data here
    }

    public String getNodeAttribute(String attrName){
        // pardon the offense, Demeter, only for demonstration...
        return node.getAttributes().getNamedItem(attrName).toString();
    }

    public void setNodeAttribute(String attrName, attrValue){
        node.setAttributeValue(attrName, attrValue);
    }

    public ArrayList<NodeFu> getChildren(){
        ArrayList<NodeFu> children = new ArrayList<NodeFu>();
        for (Node childNode : node.getChildNodes()){
            children.add(new NodeFu(childNode));
        }
        return children;
    }
} 

Я предполагаю, что у вас есть больше бизнес-логики для добавления к этому классу, который будет манипулировать данными на самом узле, в противном случае класса Node будет достаточно, и вы можете просто использовать его напрямую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...