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

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

我有一个层次化的通用数据结构。有一个根节点,在它下面可以有很多树节点,也可以只有一个数据节点,树节点可以有更多的树节点。一个基本的树结构。

我系统中的所有数据都以这种格式保存。但是,我确实希望为这些数据结构所代表的一些不同类型的数据提供强类型接口(interface)(即将通用层次树转换为强类型地址记录)。

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

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

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

谢谢!

最佳答案

Adapter 通常用来桥接两个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 类就足够了,您可以直接使用它。

关于c# - 将通用数据结构映射到特定数据结构的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2219930/

相关文章:

java - 为什么 C++ 中的 void 方法可以返回空值,而在其他语言中却不能?

c# - 控制显示在 winform 中做某事的步骤

c# - foreach 循环和数组值

c++ - 将 QTimeEdit 与 time_t 一起使用 - 适配器模式 C++

java - 如何在 PageObjects 模式中使用 WebDriver/Selenium 2 LoadComponents?

c# - 无法将参数 1 从 'char [25]' 转换为 'SAFEARRAY *'

c# - 在 C# 8 中有没有更短的写法?

c# - 使用匿名类型过滤 ICollectionView 但需要 Predicate<object>?

.net - Python 中 .Net InvalidOperationException 的类比是什么?

java - 每次算法迭代更新对象的最佳模式