将通用数据结构映射到特定数据结构的模式

时间:2010-02-08 06:27:00

标签: c# .net design-patterns data-structures tree

我有一个分层的通用数据结构。有一个根节点,在其下可以有许多树节点,或者只有一个数据节点,树节点可以有更多的树节点。基本树结构。

我系统中的所有数据都以此格式保留。但是,我希望为这些数据结构所代表的一些不同类型的数据建立一个强类型接口(即,将通用分层树转换为强类型地址记录)。

我计划使用适配器模式,我将节点传递给适配器,然后通过询问树来公开属性。这也允许我验证树(即具有特定元素并且它们中包含有效数据的树)。它还允许可扩展性(即,如果以后添加了其他数据,树本身也会暴露出来。)

您认为这是实现这一目标的最佳方法还是有更简单的方法?

注意:这是在C#和.Net 4.0中。

谢谢!

1 个答案:

答案 0 :(得分:1)

适配器通常用于桥接两个incompatible interfaces。这似乎不是你的问题。事实上,我并没有真正看到任何问题 - 因为对象语言本质上是分层的,你应该能够在类和树节点之间使用大多数一对一的映射。

也许通过“适配器”你只是指一个包装节点的类或任何描述树节点的特定对象类型,我同意。应该有相当明显的父子关系,您可以通过让您的节点类拥有或以某种方式返回子节点/类的数组,并将属性作为getter / setter来描述。任何需要的验证都可以由setter完成,或者如果需要在构造期间作为类检查给定节点及其子节点。如下所示:

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本身的数据,否则Node类就足够了,你可以直接使用它。